【问题标题】:Need to show X-axis labels on subchart selection需要在子图选择上显示 X 轴标签
【发布时间】:2019-11-11 05:58:56
【问题描述】:

c3js.org/samples/options_subchart 显示问题:当通过子图表选择的窗口导航时,x 刻度没有标签。

在这个动态窗口视图中如何添加 x 轴标签?


注意事项

这是没有选择窗口的图表,

这是选择了一个窗口的图表:

看到了吗? 没有 x 轴标签,即使每个点都存在(在这种情况下是不同的一天)。


使用@schustischuster 的示例进行编辑(通过更多数据增强)http://jsfiddle.net/xodyq92n/

 // more x-axis data to show the problem
 ['x', '2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',
       '2013-01-05', '2013-01-06', '2013-01-07', '2013-01-08',
       '2013-01-09', '2013-01-10', '2013-01-11', '2013-01-12',
       '2013-01-13'
 ]

注意@buræquete 关于culling: false 和子图表控件的线索后onbrush。我的现实生活中的数据有大约 600 个 x 轴项,所以不剔除会导致很大的模糊:

那么,问题可以概括为需要“中间剔除”

【问题讨论】:

  • 在 C3.js 子图表选项中@c3js.org/samples/options_subchart.html 选择区域时,两个 x 轴都显示标签。也许您可以提供图表的工作示例以了解发生了什么?我用 subchart 选项为时间序列数据创建了一个小提琴示例,它确实有效jsfiddle.net/xhb1jp4w
  • 谢谢@schustischuster,我编辑了。我需要查看更多标签,我没有看到 x 轴标签。
  • 这似乎是一个未解决的问题github.com/c3js/c3/issues/835
  • 感谢@schustischuster,这似乎是“不幸的答案”,这是一个 C3 错误...也许很容易为 引入一个选项/参数”提高标签密度” 当用户看到需要它时:我会提供一些赏金来鼓励解决方案。
  • PS:plot.ly/javascript 使用的是旧的 D3 版本 3,而且非常复杂和繁重(而且并非全部免费)... C3js 似乎是最好的 "plug- and-play" 图表库超过 D3,但是,seems developers abandoning it.

标签: javascript d3.js c3.js


【解决方案1】:

previous solution with culling turned off

我没有关闭culling,然后删除多余的标签,而是保持启用它,并在放大时强制在主图表中显示标签。这可以在this fiddle上查看。

或者查看下面的sn-p;

const TICK_WIDTH = 35;
var chart = document.getElementById("c3_chart");
var visibilityThreshold = chart.clientWidth / TICK_WIDTH;

function addLabelToTicks() {
  var allTicks = document.querySelectorAll("#c3_chart .c3-axis-x.c3-axis > g");
  var visibleTicks = Array.from(allTicks)
    .filter(tick => !tick.querySelector("line[x1='0'][x2='0'][y2='0']"));
  if (visibleTicks.length < visibilityThreshold) {
    visibleTicks.forEach(tick => tick.querySelector("text").style.display = "block");
  }
}

var chart = c3.generate({
  bindto: '#c3_chart',
  data: {
    x: 'x',
    //        xFormat: '%Y%m%d', // 'xFormat' can be used as custom format of 'x'
    columns: [
      ['x', '2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04', '2013-01-05', '2013-01-06',
        '2013-01-07', '2013-01-08', '2013-01-09', '2013-01-10', '2013-01-11', '2013-01-12', '2013-01-13', '2013-01-14', '2013-01-15', '2013-01-16', '2013-01-17', '2013-01-18', '2013-01-19',
        '2013-01-20', '2013-01-21', '2013-01-22', '2013-01-23', '2013-01-24', '2013-01-25', '2013-01-26'
      ],
      ['data1', 30, 200, 100, 400, 150, 250, 160, 150, 160, 150, 200, 160, 170, 30, 200, 100, 400, 150, 250, 160, 150, 160, 150, 200, 160, 170],
      ['data2', 130, 340, 200, 500, 250, 350, 320, 200, 500, 250, 350, 300, 310, 130, 340, 200, 500, 250, 350, 320, 200, 500, 250, 350, 300, 310]
    ]
  },
  subchart: {
    show: true,
    onbrush: addLabelToTicks
  },
  axis: {
    x: {
      type: 'timeseries',
      tick: {
        rotate: 25,
        //culling: false,
        format: '%Y-%m-%d'
      }
    }
  }
});
.c3 svg {
  font: 10px sans-serif
}

.c3 line,
.c3 path {
  fill: none;
  stroke: #000;
}


/* In this example I changed the line color to red for c3_chart_2 */

#c3_chart_2.c3 line,
#c3_chart_2.c3 path {
  fill: none;
  stroke: red;
}

.c3 text {
  -webkit-user-select: none;
  -moz-user-select: none;
  user-select: none
}

.c3-bars path,
.c3-event-rect,
.c3-legend-item-tile,
.c3-xgrid-focus,
.c3-ygrid {
  shape-rendering: crispEdges
}

.c3-chart-arc path {
  stroke: #fff
}

.c3-chart-arc text {
  fill: #fff;
  font-size: 13px
}

.c3-grid line {
  stroke: #aaa
}

.c3-grid text {
  fill: #aaa
}

.c3-xgrid,
.c3-ygrid {
  stroke-dasharray: 3 3
}

.c3-text.c3-empty {
  fill: gray;
  font-size: 2em
}

.c3-line {
  stroke-width: 1px
}

.c3-circle._expanded_ {
  stroke-width: 1px;
  stroke: #fff
}

.c3-selected-circle {
  fill: #fff;
  stroke-width: 2px
}

.c3-bar {
  stroke-width: 0
}

.c3-bar._expanded_ {
  fill-opacity: .75
}

.c3-target.c3-focused {
  opacity: 1
}

.c3-target.c3-focused path.c3-line,
.c3-target.c3-focused path.c3-step {
  stroke-width: 2px
}

.c3-target.c3-defocused {
  opacity: .3!important
}

.c3-region {
  fill: #4682b4;
  fill-opacity: .1
}

.c3-brush .extent {
  fill-opacity: .1
}

.c3-legend-item {
  font-size: 12px
}

.c3-legend-item-hidden {
  opacity: .15
}

.c3-legend-background {
  opacity: .75;
  fill: #fff;
  stroke: #d3d3d3;
  stroke-width: 1
}

.c3-tooltip-container {
  z-index: 10
}

.c3-tooltip {
  border-collapse: collapse;
  border-spacing: 0;
  background-color: #fff;
  empty-cells: show;
  -webkit-box-shadow: 7px 7px 12px -9px #777;
  -moz-box-shadow: 7px 7px 12px -9px #777;
  box-shadow: 7px 7px 12px -9px #777;
  opacity: .9
}

.c3-tooltip tr {
  border: 1px solid #CCC
}

.c3-tooltip th {
  background-color: #aaa;
  font-size: 14px;
  padding: 2px 5px;
  text-align: left;
  color: #FFF
}

.c3-tooltip td {
  font-size: 13px;
  padding: 3px 6px;
  background-color: #fff;
  border-left: 1px dotted #999
}

.c3-tooltip td>span {
  display: inline-block;
  width: 10px;
  height: 10px;
  margin-right: 6px
}

.c3-tooltip td.value {
  text-align: right
}

.c3-area {
  stroke-width: 0;
  opacity: .2
}

.c3-chart-arcs-title {
  dominant-baseline: middle;
  font-size: 1.3em
}

.c3-chart-arcs .c3-chart-arcs-background {
  fill: #e0e0e0;
  stroke: none
}

.c3-chart-arcs .c3-chart-arcs-gauge-unit {
  fill: #000;
  font-size: 16px
}

.c3-chart-arcs .c3-chart-arcs-gauge-max,
.c3-chart-arcs .c3-chart-arcs-gauge-min {
  fill: #777
}

.c3-chart-arc .c3-gauge-value {
  fill: #000
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/c3/0.4.10/c3.min.js"></script>

<body>
  <br><br>
  <div id="c3_chart" style="width: 90%; height: 270px"></div>

它是如何工作的? 标签总是生成的,但使用display:none css 配置隐藏。所以我的解决方案是始终跟踪顶部图表中的可见刻度数,当它低于某个阈值(例如放大)时,始终显示这些隐藏标签 (display:block)。

警告

  • 当您为某些类名更新 c3 和 d3 时,此函数可能不起作用,或者对象的层次结构可能会发生变化,因此需要更新函数中的逻辑。至少我保留了纯 js 函数,因此不会有影响它的 3rd 方版本更改的问题。

【讨论】:

  • culling 属性是一个很好的线索,但还不是解决方案:在轴(子图表和主图表)上造成很大的模糊。我们需要一个“中介剔除效果”。我的数据有大约 600 个 x 轴项目。
  • @PeterKrauss 你试过第二把小提琴吗?过滤子图表的报价?顶部图表中的混乱在放大后应该会消失,但是您也可以对顶部图表应用相同的逻辑,例如如果有超过 n 个刻度,那么也对顶部图表应用相同的过滤?你怎么看?虽然有点紧张......
  • 谢谢,现在我明白了,对不起。你正朝着正确的方向前进! ...我会尝试做一些微调,明天回来发表意见。看起来不错,值得一票!
  • 您好,我投了赞成票,看来赏金没有竞争对手(3 票已经保证一半,但我们必须等待其他答案的时间才能获得奖励)。对您的代码和答案的建议:1. 在答案文本中包含addLabelToTicks() 代码,即解决方案的核心; 2. 用一些指向 bindto 的 C3 内部指针替换 mainChartTicks = document.querySelectorAll(etc) 的全局文档的理想选择。 3.mainTickCount &gt; 20 的值 20 看起来很神奇,也许理想是一个参数。
  • 这适用于条形图吗?我似乎无法让它工作。
猜你喜欢
  • 1970-01-01
  • 2021-12-03
  • 2011-11-06
  • 2019-01-28
  • 2014-07-04
  • 2020-11-20
  • 2019-09-29
  • 1970-01-01
  • 2021-12-08
相关资源
最近更新 更多