在C++项目中使用ImGui构建界面时,若需要展示数据变化趋势、分布特征等内容,借助Dear ImPlot库可以快速实现各类图表的绘制,不需要额外开发复杂的绘图逻辑。

Dear ImPlot基础集成步骤
首先需要将Dear ImPlot库添加到项目中,它依赖ImGui和ImPlot的核心文件,集成时只需将对应的头文件和源文件加入编译列表即可。初始化时需要先完成ImGui的上下文创建,再初始化ImPlot上下文,示例代码如下:
#include <imgui.h> #include <imgui_impl_glfw.h> #include <imgui_impl_opengl3.h> #include <implot.h> // 初始化ImGui IMGUI_CHECKVERSION(); ImGui::CreateContext(); ImPlot::CreateContext(); // 初始化ImPlot上下文 ImGuiIO& io = ImGui::GetIO(); // 后续完成平台渲染后端初始化,比如GLFW、OpenGL3的初始化 // 主循环中先调用ImGui的新帧、渲染逻辑,再处理ImPlot的绘制
常见图表绘制方法
折线图绘制
折线图适合展示数据随时间或序列的变化趋势,绘制时需要准备x轴和y轴的数据数组,调用ImPlot::PlotLine函数即可。下面是绘制简单折线图的示例:
// 准备数据
float x_data[100];
float y_data[100];
for (int i = 0; i < 100; i++) {
x_data[i] = (float)i;
y_data[i] = sinf(i * 0.1f) * 10.0f; // 生成正弦波数据
}
// 在ImGui窗口中绘制
ImGui::Begin("折线图示例");
if (ImPlot::BeginPlot("正弦波折线图")) {
ImPlot::PlotLine("正弦曲线", x_data, y_data, 100);
ImPlot::EndPlot();
}
ImGui::End();
柱状图绘制
柱状图适合对比不同类别的数据大小,使用ImPlot::PlotBars函数实现,需要指定每个柱子的位置和高度,还可以设置柱子的宽度。示例代码如下:
// 准备柱状图数据
const char* labels[5] = {"A", "B", "C", "D", "E"};
double values[5] = {12.5, 23.1, 18.7, 30.2, 15.9};
double positions[5] = {0.0, 1.0, 2.0, 3.0, 4.0};
ImGui::Begin("柱状图示例");
if (ImPlot::BeginPlot("类别数据对比")) {
ImPlot::PlotBars("数据值", positions, values, 5, 0.8); // 0.8为柱子宽度
ImPlot::EndPlot();
}
ImGui::End();
散点图绘制
散点图用于展示两个变量之间的分布关系,调用ImPlot::PlotScatter函数,传入两组数据即可。示例代码如下:
// 准备散点数据
float scatter_x[50];
float scatter_y[50];
for (int i = 0; i < 50; i++) {
scatter_x[i] = (float)rand() / RAND_MAX * 100.0f;
scatter_y[i] = (float)rand() / RAND_MAX * 100.0f;
}
ImGui::Begin("散点图示例");
if (ImPlot::BeginPlot("随机散点分布")) {
ImPlot::PlotScatter("随机点", scatter_x, scatter_y, 50);
ImPlot::EndPlot();
}
ImGui::End();
图表样式自定义
Dear ImPlot支持自定义图表的轴标签、颜色、图例等样式,通过ImPlot::SetupAxis、ImPlot::SetupStyle等函数可以实现个性化配置。比如设置x轴和y轴的标签:
ImGui::Begin("自定义样式图表");
if (ImPlot::BeginPlot("自定义图表")) {
ImPlot::SetupAxis(ImAxis_X, "时间(秒)"); // 设置x轴标签
ImPlot::SetupAxis(ImAxis_Y, "数值大小"); // 设置y轴标签
// 绘制图表内容
ImPlot::EndPlot();
}
ImGui::End();
注意事项
- 绘制图表前必须调用
ImPlot::BeginPlot,绘制完成后调用ImPlot::EndPlot,否则会出现渲染错误 - 传入的数据数组生命周期需要覆盖绘制过程,避免传入临时数组导致数据异常
- 如果需要动态更新图表数据,只需要在每一帧更新对应的数据数组内容即可,不需要重新创建图表对象
Dear_ImPlotImGuiC++图表绘制数据可视化修改时间:2026-07-06 02:54:25