Javascript c3.js散点图轴未缩放以调整点半径

Javascript c3.js散点图轴未缩放以调整点半径,javascript,c3.js,Javascript,C3.js,我创建了一个c3散点图,根据数据生成不同大小的点。如果图形最左侧或最右侧附近的点相对较大,则该点不会包含在图形中,部分点会被截断。如果我添加了静态填充,图形就不能针对不同的情况进行适当的缩放,有时填充太多或太少。有没有办法通过动态生成填充来包含图形中的点 代码: 函数getChart(gridData){ 变量颜色=['#b2182b'、'#d6604d'、'#f4a582'、'#fddbc7'、'#f7f7f7'、'#d1e5f0'、'#92c5de'、'4393c3'、'#4392c3'、'

我创建了一个c3散点图,根据数据生成不同大小的点。如果图形最左侧或最右侧附近的点相对较大,则该点不会包含在图形中,部分点会被截断。如果我添加了静态填充,图形就不能针对不同的情况进行适当的缩放,有时填充太多或太少。有没有办法通过动态生成填充来包含图形中的点

代码:

函数getChart(gridData){
变量颜色=['#b2182b'、'#d6604d'、'#f4a582'、'#fddbc7'、'#f7f7f7'、'#d1e5f0'、'#92c5de'、'4393c3'、'#4392c3'、'2166ac';
var列=[];
var mySize={};
var mySizeArray=[];
var myXs={};
var myNames=[];
var-myPointColors;
MyPointColor={};
变量点大小;
var newData=extractPointsFromGrid(gridData);
pointSize=函数(sizeVal,sizeVal){
var发生率=sizeVal;
var最小发生率=d3.MIN(大小);
var MAX_关联度=d3.MAX(大小);
变量qtl3=d3.平均值(大小);
//无检查超复数运算表达式JS
var s=((发生率-最小发生率)*(50-10))/(最大发生率-最小发生率)+3;
返回(s+数学层(qtl3)>3)?s+数学层(qtl3):3;
};
var bubbleSizes=函数(大小){
变量_size=typeof size==“对象”?大小:[];
var len=(typeof _size=='object')?size.length:0;
var SizeArray=u.pull(_size,'iCumulative');
var reacsArray=u.pull(_大小,'reac');
var newSizes=[];
_大小。forEach(函数(大小){
var newSize=点大小(Math.abs(size.iCumulative),SizeArray);
push({'reac':size.reac,'size':newSize});
});
window.size=新闻大小;
返回消息;
};
var myNameIndex=[];
var mypointsize=[];
var i=0;
var myColors=bubbleColors.reverse();
var myPts=气泡大小(newData);
var dynamicadding=adddynamicadding(myPts,newData);
newData.forEach(函数(d){
var name=d.reac;
var myRor=[d.reac];
var myPs=[d.reac+“_主要嫌疑犯”];
推镜(d.ROR);
myPs.push(d.PS);
myNames.push(d.reac);
myNameIndex[i]=d.reac;
myPointColors[d.reac]=myColors[i];
列。推送(myRor);
列。推送(myPs);
myXs[myRor[0]]=myPs[0];
mySize[d.reac]=d.iCumulative;
myNameIndex[d.reac]=d.PS;
mypointsize.push={'reac':d.reac,'size':d.iCumulative};
i++;
});
var图表=c3.0({
bindto:“#RX信号图气泡”,
尺寸:{
身高:200
},
数据:{
xs:myXs,
列:列,
键入:“散布”,
颜色:MyPointColor
},
轴线:{
x:{
标签:“主要可疑案件”,
勾选:{
拟合:假
},
//填充:{top:200,left:0,right:0,bottom:0}
},
y:{
标签:“ROR”,
勾选:{
fit:false,
格式:函数(d){
返回值(d<0)?“”:d;
}
},
//填充:{顶部:5,左侧:5,右侧:100,底部:5}
}
},
要点:{
r:功能(d){
pointSize=389; where(myPts,{reac:d.id})[0];
返回pointSize.size;
},
重点:{
扩展:{
启用:false,
r:功能(d){
返回d.r;
}
}
}
},
工具提示:{
格式:{
标题:职能(d){
返回false;
},
名称:函数(名称){
返回名称;
},
值:函数(值、比率、id、大小、x){
var numFormat=d3.format(',');
var decFormat=d3.format('.');
var pctgFormat=d3.format('.4p');
返回“主要可疑案例”+numFormat(myNameIndex[id])+“”++“ROR”+numFormat(value)+“”;
}
}
}
});
var getPaddingChange=函数(图表){
变量变化={
排名:0,
左:0,,
右:0,,
底部:0
};
var m=chart.internal.main.node().parentNode.getBoundingClientRect();
//图表区域通过此变换移动-因此我们需要按此量调整点坐标
var t=d3.transform(chart.internal.main.attr(“transform”)).translate;
//循环通过每个点
chart.internal.main.selectAll('.'+c3.chart.internal.fn.CLASS.circle)。每个(函数(){
var c=this.getBBox();
//左剪辑
如果(c.x<-t[0])
change.left=Math.max(change.left,-(c.x+t[0]);
//右剪辑
如果((c.x+c.width)>(m.width-t[0]))
change.right=Math.max(change.right,(c.x+c.width)-(m.width-t[0]);
//顶部剪辑
如果(c.y<-t[1])
change.top=Math.max(change.top,-(c.y+t[1]);
//底部剪辑
如果((c.y+c.height)>(m.height-t[1]))
change.bottom=Math.max(change.bottom,(c.y+c.height)-(m.height-t[1]);
})
回报变化;
}
var变更=getPaddingChange(图表);
chart.internal.config.padding_top=chart.internal.getCurrentPaddingTop()+change.top;
chart.internal.config.padding\u bottom=chart.internal.getCurr
function getChart(gridData) {

    var colors = ['#b2182b', '#d6604d', '#f4a582', '#fddbc7', '#f7f7f7', '#d1e5f0', '#92c5de', '#4393c3', '#4392c3', '#2166ac'];
    var columns = [];
    var mySize = {};
    var mySizeArray = [];
    var myXs = {};
    var myNames = [];
    var myPointColors;
    myPointColors = {};
    var pointSize;
    var newData = extractPointsFromGrid(gridData);

    pointSize = function (sizeVal, sizes) {
        var Incidence = sizeVal;
        var MIN_incidence = d3.min(sizes);
        var MAX_incidence = d3.max(sizes);
        var qtl3 = d3.mean(sizes);

        //noinspection OverlyComplexArithmeticExpressionJS
        var s = ((Incidence - MIN_incidence) * (50 - 10)) / (MAX_incidence - MIN_incidence) + 3;

        return (s + Math.floor(qtl3) > 3) ? s + Math.floor(qtl3) : 3;
    };

    var bubbleSizes = function (sizes) {
        var _sizes = typeof sizes === 'object' ? sizes : [];
        var len = (typeof _sizes === 'object') ? sizes.length : 0;

        var sizesArray = _.pluck(_sizes, 'iCumulative');

        var reacsArray = _.pluck(_sizes, 'reac');
        var newSizes = [];
        _sizes.forEach(function (size) {

            var newSize = pointSize(Math.abs(size.iCumulative), sizesArray);
            newSizes.push({'reac': size.reac, 'size': newSize});
        });
        window.sizes = newSizes;
        return newSizes;
    };

    var myNameIndex = [];
    var myPointSizes = [];
    var i = 0;

    var myColors = bubbleColors.reverse();
    var myPts = bubbleSizes(newData);
    var dynamicPadding = addDynamicPadding(myPts, newData);

    newData.forEach(function (d) {
        var name = d.reac;
        var myRor = [d.reac];
        var myPs = [d.reac + "_Primary Suspect"];

        myRor.push(d.ROR);
        myPs.push(d.PS);
        myNames.push(d.reac);
        myNameIndex[i] = d.reac;
        myPointColors[d.reac] = myColors[i];

        columns.push(myRor);
        columns.push(myPs);
        myXs[myRor[0]] = myPs[0];
        mySize[d.reac] = d.iCumulative;
        myNameIndex[d.reac] = d.PS;
        myPointSizes.push = {'reac': d.reac, 'size': d.iCumulative};

        i++;
    });

    var chart = c3.generate({
        bindto: '#rxsignal-chart-bubble',
        size: {
            height: 200
        },
        data: {
            xs: myXs,
            columns: columns,
            type: 'scatter',
            colors: myPointColors
        },
        axis: {
            x: {
                label: 'Primary Suspect Cases',
                tick: {
                    fit: false
                },
                // padding: {top: 200, left: 0, right: 0, bottom: 0}
            },
            y: {
                label: 'ROR',
                tick: {
                    fit: false,
                    format: function (d) {
                        return (d < 0) ? '' : d;
                    }
                },
                // padding: {top: 5, left: 5, right: 100, bottom: 5}
            }
        },
        point: {
            r: function (d) {
                pointSize = _.where(myPts, {reac: d.id})[0];
                return pointSize.size;
            },
            focus: {
                expand: {
                    enabled: false,
                    r: function (d) {
                        return d.r;
                    }
                }

            }
        },
        tooltip: {

            format: {
                title: function (d) {

                    return false;

                },
                name: function (name) {
                    return name;
                },
                value: function (value, ratio, id, size, x) {

                    var numFormat = d3.format(',');
                    var decFormat = d3.format('.');
                    var pctgFormat = d3.format('.4p');

                    return '<tr colspan="2"><td>Primary Suspect Cases</td><td>' + numFormat(myNameIndex[id]) + '</td></tr>' + '<tr><td>ROR</td><td>' + numFormat(value) + '</td></tr>';

                }
            }
        }
    });

    var getPaddingChange = function (chart) {
        var change = {
            top: 0,
            left: 0,
            right: 0,
            bottom: 0
        };

        var m = chart.internal.main.node().parentNode.getBoundingClientRect();
        // the chart area is shifted by this transform - so we need to adjust the point coordinates by this amount
        var t = d3.transform(chart.internal.main.attr("transform")).translate;
        // loop through each point
        chart.internal.main.selectAll('.' + c3.chart.internal.fn.CLASS.circle).each(function () {
            var c = this.getBBox();

            // left clipping
            if (c.x < -t[0])
                change.left = Math.max(change.left, -(c.x + t[0]));
            // right clipping
            if ((c.x + c.width) > (m.width - t[0]))
                change.right = Math.max(change.right, (c.x + c.width) - (m.width - t[0]));
            // top clipping
            if (c.y < -t[1])
                change.top = Math.max(change.top, -(c.y + t[1]));
            // bottom clipping
            if ((c.y + c.height) > (m.height - t[1]))
                change.bottom = Math.max(change.bottom, (c.y + c.height) - (m.height - t[1]));
        })

        return change;
    }

    var change = getPaddingChange(chart);

    chart.internal.config.padding_top = chart.internal.getCurrentPaddingTop() + change.top;
    chart.internal.config.padding_bottom = chart.internal.getCurrentPaddingBottom() + change.bottom;
    chart.internal.config.padding_left = chart.internal.getCurrentPaddingLeft() + change.left;
    chart.internal.config.padding_right = chart.internal.getCurrentPaddingRight() + change.right;
    // force a redraw
    chart.flush();

    // remove clip path
    chart.internal.main.select('.' + c3.chart.internal.fn.CLASS.chart).attr('clip-path', null);

}
var getPaddingChange = function (chart) {
    var change = {
        top: 0,
        left: 0,
        right: 0,
        bottom: 0
    };

    var m = chart.internal.main.node().parentNode.getBoundingClientRect();
    // the chart area is shifted by this transform - so we need to adjust the point coordinates by this amount
    var t = d3.transform(chart.internal.main.attr("transform")).translate;
    // loop through each point
    chart.internal.main.selectAll('.' + c3.chart.internal.fn.CLASS.circle).each(function () {
        var c = this.getBBox();

        // left clipping
        if (c.x < -t[0])
            change.left = Math.max(change.left, -(c.x + t[0]));
        // right clipping
        if ((c.x + c.width) > (m.width - t[0]))
            change.right = Math.max(change.right, (c.x + c.width) - (m.width - t[0]));
        // top clipping
        if (c.y < -t[1])
            change.top = Math.max(change.top, -(c.y + t[1]));
        // bottom clipping
        if ((c.y + c.height) > (m.height - t[1]))
            change.bottom = Math.max(change.bottom, (c.y + c.height) - (m.height - t[1]));
    })

    return change;
}
var change = getPaddingChange(chart);

chart.internal.config.padding_top = chart.internal.getCurrentPaddingTop() + change.top;
chart.internal.config.padding_bottom = chart.internal.getCurrentPaddingBottom() + change.bottom;
chart.internal.config.padding_left = chart.internal.getCurrentPaddingLeft() + change.left;
chart.internal.config.padding_right = chart.internal.getCurrentPaddingRight() + change.right;
// force a redraw
chart.flush();

// remove clip path
chart.internal.main.select('.' + c3.chart.internal.fn.CLASS.chart).attr('clip-path', null);