【问题标题】:how to plot a histogram in c如何在c中绘制直方图
【发布时间】:2011-04-19 17:10:42
【问题描述】:

如何在 c 中从 2 个数组中绘制直方图?

【问题讨论】:

  • 您希望使用漂亮的图形还是只是一些****风格的文字?
  • 小众**风格,没什么花哨的
  • 很好的副本Frequency Histogram in C;唯一的区别是数据的性质。在不太严重的情况下,您可以在Code golf: Word frequency chart 找到多种语言的直方图输出实现,但不要按原样使用它们:代码高尔夫解决方案通常会破坏各种良好的编码标准求简洁。
  • 这2个数组有什么联系?

标签: c histogram


【解决方案1】:

你可以用这个字符(■)来表示图表中的计数。这是一个可以打印的字符

printf("%c", (char)254u);

考虑一些随机的 float_arrhist 数组来保存计数。

代码

// Function generating random data
for (i = 0; i < n; i++){
    float random = ((float)rand() / (float)(RAND_MAX));
    float_arr[i] = random;
    printf("%f  ", random);
}
//Dividing float data into bins
for (i = 0; i < n; i++){
    for (j = 1; j <= bins; j++){

        float bin_max = (float)j / (float)bins;
        if (float_arr[i] <= bin_max){
            hist[j]++;
            break;
        }
    }
}
// Plotting histogram
printf("\n\nHistogram of Float data\n");
for (i = 1; i <= bins; i++)
{
    count = hist[i];
    printf("0.%d |", i - 1);
    for (j = 0; j < count; j++)
    {
        printf("%c", (char)254u);
    }
    printf("\n");
}

输出

Histogram of Float data
0.0 |■■■■■■■■■■■■■■■■■■■■■■
0.1 |■■■■■■■■■■■■■■■■
0.2 |■■■■■
0.3 |■■■■■■■■■■■■■■
0.4 |■■■■■■■■
0.5 |■■■■■■■■■■■■■■■■
0.6 |■■■■■■■■■■
0.7 |■■■■■■■
0.8 |■■■■■■■■■■■■■■■
0.9 |■■■■■■■

【讨论】:

    【解决方案2】:

    稍微考虑一下这个问题,我不相信我在 cmets 中发现的“重复”真的是响应式的。那我就说几句吧。

    如果您已决定采用 ASCII 艺术方法,那么您只需再做出一个决定:竖条还是横条。水平很容易:只需决定缩放比例,然后为每个 bin 打印bin_contents*scale 符号。 code-golf 链接作为 what 要做什么的模型确实很有用,即使它不是 如何 编写它的一个很好的例子。

    但是,许多领域都期望在直方图的呈现中使用竖线。这有点难,但考虑一下伪代码

    sacle = find_scale(input_array)
    max_height = find_max(input_array) * scale
    for (i=max_height; i>=0; i--) 
       if (some condition)
          print_in_N_digits(round(i/scale)) // to label the scale
       else
          print_in_N_digits()               // lines with no labels
       print " |"                           // set up the vertical axis
       for (j=first_bin to lat_bin)
          if (input[j]*scale >= i)
             print("#")
          else
             print(" ")
          print_new_line
    print_in_N_digits(0)
    print(" +")
    for (j=first_bin to last_bin)
       print("-")
    print_new_line
    print_in_N_digits()
    print(" 0")
    for (j=first_bin to last_bin)
       if (some other condition)
          print_bin_label
    

    这只是遍历页面,在每个 bin 的列上使用,并且在每个级别为每列打印 " ""#"。直方图打印部分真的很容易。所有的复杂性都源于管理轴和标签。

    【讨论】:

      【解决方案3】:

      对于在其一侧布置的直方图...

      我建议对每个增量使用 printf("*"),并使用 printf("\n") 开始输出新行。 (改变方向是读者的练习)。

      【讨论】:

        【解决方案4】:

        您可以为此使用 ascii 艺术

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-11-23
          • 1970-01-01
          • 1970-01-01
          • 2015-08-26
          • 2015-11-11
          • 2012-01-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多