Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript dc.js如何在渲染后更新yscale_Javascript_D3.js_Dc.js_Crossfilter - Fatal编程技术网

Javascript dc.js如何在渲染后更新yscale

Javascript dc.js如何在渲染后更新yscale,javascript,d3.js,dc.js,crossfilter,Javascript,D3.js,Dc.js,Crossfilter,我有一个脚本,叫做seriescart。我用三个按钮链接了图表,它们加载不同的数据集并相应地更新图表(请参见下面的代码)。我希望在每次选择另一个数据集时重新定义yscale。我不知道如何才能做到这一点,因为我无法访问按钮函数中的图表对象。非常感谢你的帮助 <div class="row top-buffer"> <div class="col-sm-4"> <button class="btn"

我有一个脚本,叫做seriescart。我用三个按钮链接了图表,它们加载不同的数据集并相应地更新图表(请参见下面的代码)。我希望在每次选择另一个数据集时重新定义yscale。我不知道如何才能做到这一点,因为我无法访问按钮函数中的图表对象。非常感谢你的帮助

<div class="row  top-buffer">
<div class="col-sm-4">
    <button class="btn" onclick="button1()">1</button>
</div>
<div class="col-sm-4">
    <button class="btn" onclick="button2()">2</button>
</div>
<div class="col-sm-4">
   <button class="btn" onclick="button3()">3</button>
</div>

</div>

<div class="row top-buffer">
    <div id="chart" class="col-sm-12">
        <h6 id="title">{{ title }}</h6>
        <span class='reset'>
              Current filter: <span class='filter'></span>
        </span>
        <a class='reset'
          href='javascript:dc.filterAll();dc.redrawAll();'
          >reset</a>
    </div>
</div>


<script>

/**********************************
* Step0: template set up *
**********************************/

var width_block=  Math.max(1100, $("{{ id_chart }}").width());

var palette_color_block = ["#6c5373", "#8badd9", "#b6d6f2", "#45788c", "#6E87F2", "#996A4E", "#BF7761",
    "#735360", "#D994B0", "#6C5373", "#7F805E", "#A6A27A", "#48BDCC", "#FFC956", "#f2f2f2"];

var shades_and_tints = ["#305462", "#376070", "#3e6c7e", "#45788c", "#578597", "#6a93a3", "#7ca0ae",
"#8faeba", "#a2bbc5", "#b4c9d1", "#c7d6dc", "#d9e4e8"];

var complementary_color = ["#45788c", "#8c5945"];
var triadic_color = ["#788c45", "#45788c", "#8c4578"];

var myChart = new dc.SeriesChart("#chart");
/**********************************
* Step1: Load data from json file *
**********************************/
d3.json("{% url my_url %}").then(function(data){

    const dateFormatSpecifier = "%Y-%m-%d";
    const dateFormat = d3.timeFormat(dateFormatSpecifier);
    const dateFormatParser = d3.timeParse(dateFormatSpecifier);
    const numberFormat = d3.format('.2f');



     data.forEach(function(d) {
        d.dd = dateFormatParser(d.date);
        d.month = d3.timeMonth(d.dd); // pre-calculate month for better performance
        d.vami = +d.vami;
          });

    const minY = d3.min(data, function(d) { return d.vami; }),
          maxY = d3.max(data, function(d) { return d.vami; });

    /******************************************************
    * Step2: Create the dc.js chart objects & ling to div *
    ******************************************************/

    

    /************************************************
    * Step3:    Run the data through crossfilter    *
    ************************************************/

    ndx = crossfilter(data); // Gets our 'facts' into crossfilter

    /******************************************************
    * Step4: Create the Dimensions                        *
    * A dimension is something to group or filter by.     *
    * Crossfilter can filter by exact value, or by range. *
    ******************************************************/
    const dateDimension = ndx.dimension(d => d.dd);
    const nameMonthDimension = ndx.dimension(function(d) {return [d.name, d.month]; });
    const nameMonthGroup = nameMonthDimension .group().reduceSum(function(d) { return +d.vami; });

    let xScale = d3.scaleTime().domain([dateDimension .bottom(1)[0].dd, dateDimension .top(1)[0].dd])
    let yScale = d3.scaleLinear().domain([minY, maxY])


    /***************************************
    *   Step5: Create the Visualisations   *
    ***************************************/
    myChart
        .width(width_block)
        .height(width_block/3)
        .transitionDuration(500)
        .margins({top: width_block/30, right: width_block/20, bottom: width_block/40, left: 
           width_block/25})
        .chart(function(c) { return new dc.LineChart(c); })
        .ordinalColors(palette_color_block)
        .mouseZoomable(true)
        .brushOn(false)
        .clipPadding(10)
        .elasticY(false)
        .x(xScale)
        .y(yScale)
        .round(d3.timeMonth.round)
        .xUnits(d3.timeMonths)
        .dimension(nameMonthDimension )
        .group(nameMonthGroup )
        .seriesAccessor(function(d) {return d.key[0];})
        .keyAccessor(function(d) {return +d.key[1];})
        .valueAccessor(function(d) {return +d.value;})        
.legend(dc.legend().x(60).y(60).itemHeight(13).gap(5).horizontal(1).legendWidth(200).itemWidth(200));


    /****************************
    * Step6: Render the Charts  *
    ****************************/
    dc.renderAll();

});
function load_button(file) {
    return function load_it() {
        d3.json(file).then(function(new_data){

        const dateFormatSpecifier = "%Y-%m-%d";
        const dateFormat = d3.timeFormat(dateFormatSpecifier);
        const dateFormatParser = d3.timeParse(dateFormatSpecifier);
        const numberFormat = d3.format('.2f');



     new_data.forEach(function(d) {
        d.dd = dateFormatParser(d.date);
        d.month = d3.timeMonth(d.dd); // pre-calculate month for better performance
        d.vami = +d.vami;
          });

         const minY = d3.min(new_data, function(d) { return d.vami; }),
              maxY = d3.max(new_data, function(d) { return d.vami; });

         let yScale = d3.scaleLinear().domain([minY, maxY])

         ndx.remove(() => true);
         ndx.add(new_data);
        myChart.y(yScale);
        dc.redrawAll();
         
        });
    };
}

var button1 = load_button("{% url my_url %}"),
    button2 = load_button("{% url my_url2 %}"),
    button3 = load_button("{% url my_url3 %}");

</script> 

1.
2.
3.
{{title}}
当前筛选器:
/**********************************
*步骤0:模板设置*
**********************************/
var width_block=Math.max(1100,$).width();
变量调色板颜色块=[“6c5373”、“8badd9”、“b6d6f2”、“45788c”、“6E87F2”、“996A4E”、“BF7761”,
“#735360”、“#D994B0”、“#6C5373”、“#7F805E”、“#A6A27A”、“#48BDCC”、“#FFC956”、“#f2f2f2”];
var shades_和_tints=[“#305462”、“#376070”、“#3e6c7e”、“#45788c”、“#578597”、“#6a93a3”、“#7ca0ae”,
“#8faeba”、“#a2bbc5”、“#b4c9d1”、“#c7d6dc”、“#d9e4e8”];
var互补色=[“45788c”,“8c5945”];
变量triadic_color=[“#788c45”、“#45788c”、“#8c4578”];
var myChart=新的dc.Seriescart(“图表”);
/**********************************
*步骤1:从json文件加载数据*
**********************************/
d3.json(“{%url my_url%}”)。然后(函数(数据){
常量dateFormatSpecifier=“%Y-%m-%d”;
const dateFormat=d3.timeFormat(日期格式说明符);
const dateFormatParser=d3.timeParse(dateFormatSpecifier);
常量numberFormat=d3.format('.2f');
data.forEach(函数(d){
d、 dd=dateFormatParser(d.date);
d、 month=d3.timeMonth(d.dd);//预先计算月份以获得更好的性能
d、 vami=+d.vami;
});
const minY=d3.min(数据,函数(d){返回d.vami;}),
maxY=d3.max(数据,函数(d){返回d.vami;});
/******************************************************
*步骤2:创建dc.js图表对象&ling to div*
******************************************************/
/************************************************
*步骤3:通过交叉过滤器运行数据*
************************************************/
ndx=交叉过滤器(数据);//将“事实”放入交叉过滤器
/******************************************************
*步骤4:创建尺寸标注*
*维度是分组或筛选的依据*
*交叉过滤器可以按精确值或范围进行过滤*
******************************************************/
const dateDimension=ndx.dimension(d=>d.dd);
const nameMonthDimension=ndx.dimension(函数(d){return[d.name,d.month];});
const nameMonthGroup=nameMonthDimension.group().reduceSum(函数(d){return+d.vami;});
设xScale=d3.scaleTime().domain([dateDimension.bottom(1)[0].dd,dateDimension.top(1)[0].dd])
设yScale=d3.scaleLinear().domain([minY,maxY])
/***************************************
*步骤5:创建可视化*
***************************************/
我的图表
.宽度(宽度块)
.高度(块宽度/3)
.过渡期(500)
.margins({顶部:宽度块/30,右侧:宽度块/20,底部:宽度块/40,左侧:
宽度(块/25})
.chart(函数(c){返回新的dc.LineChart(c);})
.普通颜色(调色板\颜色块)
.mouseZoomable(真)
.brushOn(错)
.clipPadding(10)
.elasticY(假)
.x(xScale)
.y(yScale)
.round(d3.timeMonth.round)
.xUnits(d3.时间月)
.尺寸(名称和尺寸)
.组(名称MonthGroup)
.seriesAccessor(函数(d){返回d.key[0];})
.keyAccessor(函数(d){return+d.key[1];})
.valueAccessor(函数(d){return+d.value;})
.图例(dc.legend().x(60).y(60).项目高度(13).间隙(5).水平(1).legendWidth(200).项目宽度(200));
/****************************
*步骤6:渲染图表*
****************************/
dc.renderAll();
});
功能加载按钮(文件){
返回函数load_it(){
d3.json(文件).then(函数(新的_数据){
常量dateFormatSpecifier=“%Y-%m-%d”;
const dateFormat=d3.timeFormat(日期格式说明符);
const dateFormatParser=d3.timeParse(dateFormatSpecifier);
常量numberFormat=d3.format('.2f');
新的_data.forEach(函数(d){
d、 dd=dateFormatParser(d.date);
d、 month=d3.timeMonth(d.dd);//预先计算月份以获得更好的性能
d、 vami=+d.vami;
});
const minY=d3.min(新的_数据,函数(d){return d.vami;}),
maxY=d3.max(新的_数据,函数(d){返回d.vami;});
设yScale=d3.scaleLinear().domain([minY,maxY])
ndx.remove(()=>true);
ndx.add(新的_数据);
myChart.y(yScale);
dc.redrawAll();
});
};
}
var button1=load_按钮(“{%url my_url%}”),
button2=加载按钮(“{%url我的url 2%}”),
button3=加载按钮(“{%url我的url%}”);

这只是一个在哪里声明我的图表的问题

许多dc.js示例在调用
d3.json
之前声明变量:

var myChart;
d3.json("{% url my_url %}").then(function(data){
    // ...
    myChart = new dc.SeriesChart("#chart");
var myChart = new dc.SeriesChart("#chart");
d3.json("{% url my_url %}").then(function(data){
    // ...
或者,在调用
d3.json
之前移动初始化也无妨:

var myChart;
d3.json("{% url my_url %}").then(function(data){
    // ...
    myChart = new dc.SeriesChart("#chart");
var myChart = new dc.SeriesChart("#chart");
d3.json("{% url my_url %}").then(function(data){
    // ...

现在
myChart
将被全局声明,所有代码都可以访问。

太简单了!我真丢脸。非常感谢你,戈登。我还欠你的债。我相应地更新了代码。我在调用d3.json之前移动了初始化,并在dc.redrawAll()之前添加了行myChart.y(yScale);