📅  最后修改于: 2023-12-03 15:30:53.492000             🧑  作者: Mango
盒形图 (Boxplot) 是一种用于显示数据分布情况的图表,主要由五个统计量组成:最大值、最小值、下四分位数(Q1)、中位数(Q2)、上四分位数(Q3)。它通过显示数据的中位数、四分位数、极值和异常值而提供了数据集分布的紧凑的摘要。
在实际数据中,可能会存在一些异常值(Outliers),即偏离正常数据分布情况的极端数值,这些异常值常常会影响数据的可视化效果和数据分析结果。因此,在做数据可视化时,我们往往需要对这些异常值进行过滤和排除。本文将介绍如何使用 C 编程语言,制作剔除异常值的盒形图。
在 C 语言中,使用 plotly C 语言库可以方便地制作各种数据可视化图表。plotly C 语言库是 plotly.js 库的 C 语言封装版本,可以在本地环境下绘制交互式图表,并且支持多种输出格式。我们可以使用以下命令行安装 plotly C 语言库:
$ sudo apt-get update
$ sudo apt-get install -y libcairo2-dev libpython3-dev graphite2-utils pkg-config
$ git clone https://github.com/plotly/c-plotly.git
$ cd c-plotly
$ make
$ sudo make install
我们需要先读取数据文件,并计算出五个统计量:最大值、最小值、下四分位数(Q1)、中位数(Q2)、上四分位数(Q3)。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX_COLS 1000
#define MAX_ROWS 100000
int cmpfunc(const void *a, const void *b) {
return (*(double *) a - *(double *) b);
}
int main() {
double data[MAX_ROWS][MAX_COLS];
double q1, q2, q3, iqr;
double max, min;
int rows, cols;
// 读取数据文件
FILE *fp = fopen("data.csv", "r");
if (fp == NULL) {
printf("Failed to open file.\n");
return 1;
}
// 解析每一行数据
rows = 0;
cols = 0;
char line[2048];
while (fgets(line, sizeof(line), fp)) {
int n = sscanf(line, "%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf\n",
&data[rows][0], &data[rows][1], &data[rows][2], &data[rows][3],
&data[rows][4], &data[rows][5], &data[rows][6], &data[rows][7],
&data[rows][8]);
if (cols == 0) {
cols = n;
}
rows++;
if (rows >= MAX_ROWS) {
printf("Too many rows.\n");
return 1;
}
}
fclose(fp);
// 计算每一列数据的五个统计量
for (int i = 0; i <= cols; i++) {
qsort(&data[0][i], rows, sizeof(double), cmpfunc);
q2 = data[rows / 2][i];
q1 = data[rows / 4][i];
q3 = data[3 * rows / 4][i];
max = fmin(data[rows - 1][i], q3 + (q3 - q1) * 1.5);
min = fmax(data[0][i], q1 - (q3 - q1) * 1.5);
printf("Q1 = %lf, Q2 = %lf, Q3 = %lf, IQR = %lf, Max = %lf, Min = %lf\n",
q1, q2, q3, q3 - q1, max, min);
}
return 0;
}
以上代码实现了读取数据文件并计算统计量的功能。我们使用的数据文件格式为 CSV 格式,每一行为一条数据,不同列之间用逗号分隔。
我们使用 plotly C 语言库绘制剔除异常值的盒形图。具体实现如下:
#include <plotly.h>
int main() {
double data[MAX_ROWS][MAX_COLS];
double q1, q2, q3, iqr;
double max, min;
int rows, cols;
// 读取数据文件
// 略
// 计算每一列数据的五个统计量
// 略
// 绘制盒形图
plot_t *plt = plot_new();
plot_box_trace_t *box_trace = plot_box_trace_new(data[0], rows, "Box Plot", "y");
// 设置数据线颜色
plot_box_trace_set_line_color(box_trace, "#2C3E50");
// 设置上下文长度
plot_box_trace_set_whisker_length(box_trace, 1.5);
// 设置异常值样式
plot_box_trace_set_marker_symbol(box_trace, "circle");
plot_box_trace_set_marker_color(box_trace, "#E74C3C");
// 设置 y 轴范围
double y_axis_range[2];
y_axis_range[0] = min; // 设置 y 轴最小值
y_axis_range[1] = max; // 设置 y 轴最大值
plot_set_y_range(plt, y_axis_range);
// 设置图表主题样式
plot_style_t *style = plot_get_style(plt);
plot_style_set_colorway(style, "Spectral");
plot_style_set_backgroundcolor(style, "white");
plot_style_set_gridcolor(style, "gray");
plot_style_set_fontsize(style, 16);
// 设置图表标题和 x 轴标签
plot_layout_t *layout = plot_get_layout(plt);
plot_layout_set_title(layout, "Boxplot");
plot_layout_set_xaxis_title(layout, "Category");
// 添加数据线
plot_add(plt, (plot_trace_t *) box_trace);
// 显示图表
plot_show(plt);
// 释放资源
plot_destroy(plt);
return 0;
}
以上代码实现了绘制剔除异常值的盒形图的功能。我们使用了 plotly C 语言库,调用相应的 API 即可在本地环境中绘制交互式盒形图。在代码文件中,我们首先创建了一个 plot_t 对象,然后创建了一个 plot_box_trace_t 数据线对象,实例化数据线时,我们指定了数据数组、数据长度、数据线名称和绘制方向。
接下来,我们对所需要的图表样式进行了设置和调整,例如数据线样式、轴标签设置、主题样式等。
最终,我们将各种控件和数据线添加到 plot_t 对象中,并通过 plot_show 函数在本地环境中显示图表。
本文介绍了如何使用 C 编程语言绘制剔除异常值的盒形图。我们首先读取了数据文件,并计算了每一列数据的五个统计量:最大值、最小值、下四分位数(Q1)、中位数(Q2)、上四分位数(Q3),然后使用 plotly C 语言库,调用相应的 API 绘制交互式盒形图。这样,在数据可视化时,我们就能更好的呈现出数据的分布情况,更好的进行数据分析处理。