【问题标题】:C3js horizontal bar chart labels cut off and sizing issueC3js水平条形图标签切断和尺寸问题
【发布时间】:2020-02-23 12:47:15
【问题描述】:

我有一个带有相当长标签的固定大小的水平条形图。

主要问题: 数据最大的标签总是会被截断。

附加问题(很高兴有.. ;)在 C3 中是否可以在条形之间添加边距?

标签被剪掉的例子:

 var colors = ['#0065A3', '#767670', '#D73648', '#7FB2CE', '#00345B'];
var padding = 5;


data= [
['veryveryveryveryverylongdatalabel01', 439034],
['veryveryveryveryverylongdatalabel02', 413664],
['veryveryveryveryverylongdatalabel03', 351376],
['veryveryveryveryverylongdatalabel04', 349932],
['veryveryveryveryverylongdatalabel05', 316490],
['veryveryveryveryverylongdatalabel06', 315039],
['veryveryveryveryverylongdatalabel07', 285908],
['veryveryveryveryverylongdatalabel08', 285681],
['veryveryveryveryverylongdatalabel09', 285215],
['veryveryveryveryverylongdatalabel10', 203248],
['veryveryveryveryverylongdatalabel11', 200508],
['veryveryveryveryverylongdatalabel12', 195508],
['veryveryveryveryverylongdatalabel13', 195058],
['veryveryveryveryverylongdatalabel14', 193508],
['veryveryveryveryverylongdatalabel15', 185508],
['veryveryveryveryverylongdatalabel16', 180508],
['veryveryveryveryverylongdatalabel17', 177508]
];

var totalDataValue = 0
data.forEach(function(d){
	totalDataValue+=d[1];
});


var chart1 = c3.generate({
  bindto: d3.select('#chart1'),
  data: {
    columns: data,
    type: 'bar',
    labels: {format : function(v, id) {return id + ": " + d3.format(",.0f")(v) + " ["+d3.format(".2%")(v/totalDataValue)+"]"; }}
  },
  bar: {
  	width: { ratio: 1}
  },
  legend: {
    show: false,
  },
  tooltip: {
    show: true,
    format: {
      value: function(value) {
        return d3.format(",.0f")(value);
      }
    }
  },
  zoom: {
    enabled: true
  },
  axis: {
    x: {
      show:false,
      type:'category',
      categories: ['value1']
      },
    y: {
      show:false
    },
    rotated: true
  }
  });
#chart1 {
  width: 600px;
  height: 400px;
}
<link href="https://cdnjs.cloudflare.com/ajax/libs/c3/0.7.10/c3.min.css" rel="stylesheet" />
<script src="https://d3js.org/d3.v5.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/c3/0.7.10/c3.min.js"></script>
<div id="chart1" class "c3">

</div>

这似乎是内部 C3 大小问题。 我在吗? 有没有办法防止标签被切断?

谢谢

【问题讨论】:

    标签: javascript d3.js c3.js


    【解决方案1】:

    我找到了防止标签被切断的解决方案。 请参阅我的以下帖子: Calculate padding for C3js horizontal bar charts

    它基于使用全局图表填充而不是使用 y 轴填充和关闭剪辑路径

    【讨论】:

      【解决方案2】:

      您可以设置 Y 轴顶部填充。

      axis: {
          y: {
              padding : {
                  top: 430
              }
          },
          rotated: true
        }
      

      您还可以根据最大标签的长度计算顶部填充值。

      【讨论】:

      • 谢谢。这可能是一种有效的方法。尽管如此,我目前还没有解决方案如何计算填充。我们会看到;)
      • @gothmogg 我有类似的情况。我通过实际设置值发现了各种长度标签所需的填充,至少有 4-5 个不同的长度。然后我想出了一个基于标签长度的公式,我将其应用于我的集合中的最大标签长度。这种方法可能适合您。
      【解决方案3】:

      您可以在标签格式函数的末尾使用几个 "\u00A0" 添加一个空格:

      data: {
      labels: {format : function(v, id) {return id + ": " + d3.format(",.0f")(v) 
      + " ["+d3.format(".2%")(v/totalDataValue)+"]"+"\u00A0\u00A0\u00A0\u00A0\u00A0"; }}
      },
      

      要在条之间设置一些空间,请添加 bar.space 参数:

      bar: {
          space: 0.2
      }
      

      下面的代码啜饮:

      var colors = ['#0065A3', '#767670', '#D73648', '#7FB2CE', '#00345B'];
      var padding = 5;
      
      data= [
      ['veryveryveryveryverylongdatalabel01', 439034],
      ['veryveryveryveryverylongdatalabel02', 413664],
      ['veryveryveryveryverylongdatalabel03', 351376],
      ['veryveryveryveryverylongdatalabel04', 349932],
      ['veryveryveryveryverylongdatalabel05', 316490],
      ['veryveryveryveryverylongdatalabel06', 315039],
      ['veryveryveryveryverylongdatalabel07', 285908],
      ['veryveryveryveryverylongdatalabel08', 285681],
      ['veryveryveryveryverylongdatalabel09', 285215],
      ['veryveryveryveryverylongdatalabel10', 203248],
      ['veryveryveryveryverylongdatalabel11', 200508],
      ['veryveryveryveryverylongdatalabel12', 195508],
      ['veryveryveryveryverylongdatalabel13', 195058],
      ['veryveryveryveryverylongdatalabel14', 193508],
      ['veryveryveryveryverylongdatalabel15', 185508],
      ['veryveryveryveryverylongdatalabel16', 180508],
      ['veryveryveryveryverylongdatalabel17', 177508]
      ];
      
      var totalDataValue = 0
      data.forEach(function(d){
      	totalDataValue+=d[1];
      });
      
      
      var chart1 = c3.generate({
        bindto: d3.select('#chart1'),
        data: {
          columns: data,
          type: 'bar',
          labels: {format : function(v, id) {return id + ": " + d3.format(",.0f")(v) + " ["+d3.format(".2%")(v/totalDataValue)+"]"+"\u00A0\u00A0\u00A0\u00A0\u00A0"; }}
        },
       bar: {
          width: { ratio: 1},
          space: 0.2
        },
        legend: {
          show: false,
        },
        tooltip: {
          show: true,
          format: {
            value: function(value) {
              return d3.format(",.0f")(value);
            }
          }
        },
        zoom: {
          enabled: true
        },
        axis: {
          x: {
            show:false,
            type:'category',
            categories: ['value1']
            },
          y: {
            show:false
          },
          rotated: true
        }
        });
        
      #chart1 {
        width: 600px;
        height: 400px;
      }
      <link href="https://cdnjs.cloudflare.com/ajax/libs/c3/0.7.10/c3.min.css" rel="stylesheet" />
      <script src="https://d3js.org/d3.v5.min.js"></script>
      <script src="https://cdnjs.cloudflare.com/ajax/libs/c3/0.7.10/c3.min.js"></script>
      
      <body>
      <br><br>
      
      <div id="chart1" class "c3">

      【讨论】:

      • 谢谢,但添加“\u00A0”并没有真正起作用,因为标签没有固定长度,因此“\u00A0”的数量需要可变。我想我会各自去 C3 并在那里打开一个问题。
      • 如何根据标签名称的长度动态设置“\u00A0”的数量。我假设您的标签名称不会比您示例中的名称长(大约 35 个字母) - 因此添加四个或五个“\u00A0”对于最长的情况就足够了。你可以很容易地为此编写一个函数。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-20
      • 1970-01-01
      相关资源
      最近更新 更多