制作单词频率直方图

Making histogram of frequency of words

本文关键字:直方图 频率 单词      更新时间:2023-09-26

所以我成功地创建了一个数字频率的直方图。我想在文字上也这样做。

bins = [1,1,1,2,3,4,4,4,4,5,5,6,6,6,2,2,3,3,1,23,54,6,6,7,6,5,4]
@svg = d3
  .select('.histogram')
  .append('svg')
  .attr('width', @model.get('width'))
  .attr('height', @model.get('height'))
  .append('g')
data = d3
  .layout
  .histogram().bins(bins.length)(bins)
bar = @svg
  .selectAll('.bar')
  .data(data)
  .enter()
  .append('g')
bar
  .append('rect')
  .attr('x', 0)
  .attr('y', (d) -> return d.x*5)
  .attr("width", (d) -> return d.y * 20)
  .attr("height", 5)
  .attr('fill','steel')

我想为这样的阵列建立一个频率直方图-

    bins = ['hello','hello','goodbye','goodbye','beatles','kill','harry','harry']

我该怎么做?使用直方图布局的值函数似乎是一个不错的选择,但这意味着我需要以某种方式保持状态。此外,我希望它能使单词作为标签出现在其关联栏旁边。

感谢

我认为你不应该为分类数据布局.histogram,因为这种布局的想法是将值分布到bin中,而在你的情况下,每个单词只有一个单独的栏。

所以考虑一下这个演示。

在这里我手动计算分布:

// calculate frequency for each word in the list
var groups = _(values).chain()
    .groupBy(_.identity)
    .map(function (values, key) {
        return {
            freq: values.length,
            value: key
        };
    })
    .sortBy(function (d) { return d.value; })
    .value();

然后从这些组中画一个简单的条形图:

var bars = svg.selectAll('.bar')
    .data(groups)
    .enter().append('g');
bars
    .append('rect')
    .attr('x', 0)
    .attr('y', function (d, i) { return yScale(i); })
    .attr("width", function (d) { return xScale(d.freq); })
    .attr("height", barHeight)
    .attr('fill','steel');