带标记的NVD3线图可能吗?

时间:2012-12-05 21:39:38

标签: nvd3.js

如果我可以为每个数据点而不仅仅是线本身显示标记,那么我正在制作一个NVD3线图,它将显着提高清晰度。不幸的是,我还没有找到一种简单的方法来使用NVD3。我还考虑使用散点图,但我无法弄清楚如何在点之间显示连接线。我考虑的第三个选项是覆盖一条线和散点图,但这会在图例中显示每个系列两次,并可能导致其他不必要的视觉复杂情况。

有没有办法优雅地解决这个问题呢?我的格式化技术的示例代码如下所示,但test_data中的'size'和'shape'属性对当前代码的线图没有影响。

test_data = [ {     key: 'series1',
            values: [
                { x: 1, y: 2.33, size:5, shape:"circle" },
                { x: 2, y: 2.34, size:5, shape:"circle" },
                { x: 3, y: 2.03, size:5, shape:"circle" },
        ] } ];


nv.addGraph(function() {
  var test_chart = nv.models.lineChart();
  test_chart.xAxis.axisLabel('Sample Number');
  test_chart.yAxis
        .axisLabel('Voltage (V)')
        .tickFormat(d3.format('.02f'));

  d3.select('#test_plot')
      .datum(test_data)
    .transition().duration(500)
      .call(test_chart);

  nv.utils.windowResize(test_chart.update);
  return test_chart;
});

5 个答案:

答案 0 :(得分:17)

我还想在我正在处理的项目中添加标记。这是我的合作伙伴和我找到的解决方案。

首先,您必须选择图表中的所有点并将填充不透明度设置为1:

#my-chart .nv-lineChart circle.nv-point
{
    fill-opacity: 1;
}

现在您的积分将会显示。要调整每个点的大小,您需要修改每个点的“r”(对于半径)属性。这不是一种风格,所以你不能用css做到这一点。这是一些完成这项工作的jQuery代码。 500毫秒的延迟是在呈现图表之前代码不会运行的。此代码段将半径设置为3.5:

        setTimeout(function() {
            $('#my-chart .nv-lineChart circle.nv-point').attr("r", "3.5");
        }, 500);

答案 1 :(得分:11)

在我得到社区的帮助之前,这让我很困惑:

css styling of points in figure

所以这是我的解决方案,基于css

.nv-point {
    stroke-opacity: 1!important;
    stroke-width: 5px!important;
    fill-opacity: 1!important;
}

如果有人来自rCharts,则下面是一个rmarkdown模板,可以创建包含这些行和标记的nPlot

 ```{r 'Figure'}  
require(rCharts)
load("data/df.Rda") 
# round data for rChart tooltip display
df$value <- round(df$value, 2)
n <- nPlot(value ~ Year, group = 'variable', data = df, type = 'lineChart') 
n$yAxis(axisLabel = 'Labor and capital income (% national income)')
n$chart(margin = list(left = 100)) # margin makes room for label
n$yAxis(tickFormat = "#! function(d) {return Math.round(d*100*100)/100 + '%'} !#")
n$xAxis(axisLabel = 'Year')
n$chart(useInteractiveGuideline=TRUE)
n$chart(color = colorPalette)
n$addParams(height = 500, width = 800)
n$setTemplate(afterScript = '<style>
  .nv-point {
    stroke-opacity: 1!important;
    stroke-width: 6px!important;
    fill-opacity: 1!important;
  } 
</style>'
)
n$save('figures/Figure.html', standalone = TRUE)
```

答案 2 :(得分:4)

当前版本的nvd3使用路径而不是圆圈来绘制标记。这是我用来显示标记的一段css代码。

#chart g.nv-scatter g.nv-series-0 path.nv-point
{
    fill-opacity: 1;
    stroke-opacity: 1;
}

我还在https://github.com/novus/nvd3/issues/321写了一些关于此的内容,你可以找到我如何改变制作者的形状。

我不知道如何改变标记的大小。试图找到解决方案。

答案 3 :(得分:2)

使用nvd3中的以下逻辑有选择地为某些系列启用点。

//i is the series number; starts with 0

var selector = 'g.nv-series-'+i+' circle';
d3.selectAll(selector).classed("hover",true);

然而,数据中的附加参数(比如说'enable_points':'true')会更有意义。我希望用这个想法推动对nvd3的一些改变。

答案 4 :(得分:2)

对于当前版本的NVD3(1.8.x),我使用这个基于D3的解决方案(仅限脚本,不需要CSS文件或样式块):

nv.addGraph(function() {
  // ...
  return chart;
},
function() {
  // this function is called after the chart is added to document
  d3.selectAll('#myChart .nv-lineChart .nv-point').style("stroke-width",
    "7px").style("fill-opacity", ".95").style("stroke-opacity", ".95");
}
);

使用的样式正是NVD3通过将“悬停”类应用于每个点(悬停时)添加的样式。根据您的需要调整它们。