如何在2个数组的c中绘制直方图?
答案 0 :(得分:1)
对于排列在其旁边的直方图......
我建议对每个增量使用printf(“*”),并使用printf(“\ n”)开始输出新行。 (改变方向是读者的练习)。
答案 1 :(得分:1)
对这个问题的思考有点我不相信我在评论中指出的“重复”真的很敏感。所以我会说几句话。
如果您已经确定了ASCII艺术方法,那么您只需再做一个决定:垂直或水平条。水平很简单:只需确定缩放比例,然后为每个bin打印bin_contents*scale
符号。代码高尔夫链接作为要做什么的模型非常有用,即使不是如何编写它的好例子。
然而,许多字段在直方图的呈现中期望垂直条。这有点难,但考虑伪代码
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的列,每个级别为每列打印" "
或"#"
。直方图打印部分非常简单。所有的复杂性都来自管理轴和标签。
答案 2 :(得分:1)
您可以使用此字符(■)来表示图形中的计数。这是一个可以打印的字符
printf("%c", (char)254u);
考虑一些随机的float_arr
和hist
数组来保存计数。
代码
// 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 |■■■■■■■
答案 3 :(得分:0)
你可以使用ascii art