编辑
2025-10-05
C#
00

目录

环境设置
基础柱状图
多系列柱状图
堆叠柱状图
结论

OxyPlot是一个强大的跨平台绘图库,可以在WinForms应用程序中创建高质量的图表。本指南将重点介绍如何使用OxyPlot在WinForms中创建各种类型的柱状图。

环境设置

首先,您需要在您的WinForms项目中安装OxyPlot。您可以通过NuGet包管理器安装以下包:

  • OxyPlot.Core
  • OxyPlot.WindowsForms

image.png

在Visual Studio中,右键点击您的项目,选择"管理NuGet包",然后搜索并安装这两个包。

安装完成后,在您的代码中添加以下using语句:

C#
using OxyPlot; using OxyPlot.Series; using OxyPlot.WindowsForms;

基础柱状图

让我们从一个简单的柱状图开始。

  1. 在代码中,创建一个PlotModelBarSeries,然后将数据添加到系列中。
C#
using System; using System.Windows.Forms; using OxyPlot; using OxyPlot.Series; // 确保包含这个命名空间 using OxyPlot.WindowsForms; // 如果使用 Windows Forms namespace AppOxyPlot { public partial class Form1 : Form { private PlotView plotView1; // 声明 PlotView public Form1() { InitializeComponent(); // 初始化 PlotView plotView1 = new PlotView(); plotView1.Dock = DockStyle.Fill; this.Controls.Add(plotView1); CreateBasicBarChart(); } private void CreateBasicBarChart() { var model = new PlotModel { Title = "基础柱状图" }; var series = new BarSeries(); series.Items.Add(new BarItem(5)); series.Items.Add(new BarItem(3)); series.Items.Add(new BarItem(7)); series.Items.Add(new BarItem(2)); series.Items.Add(new BarItem(9)); model.Series.Add(series); plotView1.Model = model; } } }

image.png

这将创建一个简单的柱状图,包含5个数据点。

多系列柱状图

要创建包含多个系列的柱状图,只需添加多个BarSeries到模型中。

C#
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using OxyPlot.WindowsForms; using OxyPlot; using OxyPlot.Axes; using OxyPlot.Legends; using OxyPlot.Series; namespace AppOxyPlot { public partial class Form2 : Form { private PlotModel plotModel; public Form2() { InitializeComponent(); InitializePlotView(); } private void InitializePlotView() { // 创建PlotModel plotModel = new PlotModel { Title = "季度产品销售对比", TitleFontSize = 16, TitleColor = OxyColors.Black }; plotModel.Legends.Add(new Legend { LegendPosition = LegendPosition.RightMiddle, LegendPlacement = LegendPlacement.Outside, LegendOrientation = LegendOrientation.Vertical }); // 创建多个柱状图系列 var electronicsSeries = CreateBarSeries("电子产品", OxyColors.Blue); var clothingSeries = CreateBarSeries("服装", OxyColors.Green); var foodSeries = CreateBarSeries("食品", OxyColors.Red); // 添加数据 AddSeriesData(electronicsSeries, new double[] { 120.5, 150.3, 200.7, 180.2 }); AddSeriesData(clothingSeries, new double[] { 85.3, 95.6, 110.4, 130.1 }); AddSeriesData(foodSeries, new double[] { 65.7, 78.2, 90.5, 105.3 }); // 创建类别轴(垂直轴) var categoryAxis = new CategoryAxis { Position = AxisPosition.Left, Key = "CategoryAxis", Title = "产品类别", TitleFontSize = 12, TitleColor = OxyColors.Black }; categoryAxis.Labels.AddRange(new[] { "Q1", "Q2", "Q3", "Q4" }); // 创建数值轴(水平轴) var valueAxis = new LinearAxis { Position = AxisPosition.Bottom, Title = "销售额 (万元)", TitleFontSize = 12, TitleColor = OxyColors.Black, MinimumPadding = 0, MaximumPadding = 0.1, MajorGridlineStyle = LineStyle.Solid, MinorGridlineStyle = LineStyle.Dot, MajorGridlineColor = OxyColors.LightGray, MinorGridlineColor = OxyColors.LightGray }; // 将轴和序列添加到PlotModel plotModel.Axes.Add(categoryAxis); plotModel.Axes.Add(valueAxis); plotModel.Series.Add(electronicsSeries); plotModel.Series.Add(clothingSeries); plotModel.Series.Add(foodSeries); // 设置PlotView的模型 plotView1.Model = plotModel; } // 创建柱状图系列的辅助方法 private BarSeries CreateBarSeries(string title, OxyColor color) { return new BarSeries { Title = title, StrokeColor = OxyColors.Black, StrokeThickness = 1, FillColor = color, BarWidth = 0.8 // 可以调整柱子宽度 }; } // 添加数据的辅助方法 private void AddSeriesData(BarSeries series, double[] values) { for (int i = 0; i < values.Length; i++) { series.Items.Add(new BarItem(values[i]) { CategoryIndex = i }); } } // 动态更新数据的方法 private void UpdateChartData() { // 清除现有数据 foreach (var series in plotModel.Series) { if (series is BarSeries barSeries) { barSeries.Items.Clear(); } } // 添加新数据 var electronicsSeries = plotModel.Series[0] as BarSeries; var clothingSeries = plotModel.Series[1] as BarSeries; var foodSeries = plotModel.Series[2] as BarSeries; if (electronicsSeries != null && clothingSeries != null && foodSeries != null) { AddSeriesData(electronicsSeries, new double[] { 140.5, 170.3, 220.7, 200.2 }); AddSeriesData(clothingSeries, new double[] { 95.3, 105.6, 120.4, 140.1 }); AddSeriesData(foodSeries, new double[] { 75.7, 88.2, 100.5, 115.3 }); // 通知模型更新 plotModel.InvalidatePlot(true); } } // 添加按钮来触发数据更新(可选) private void btnUpdateData_Click(object sender, EventArgs e) { UpdateChartData(); } } }

image.png

堆叠柱状图

C#
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using OxyPlot; using OxyPlot.Axes; using OxyPlot.Legends; using OxyPlot.Series; using OxyPlot.WindowsForms; namespace AppOxyPlot { public partial class Form3 : Form { private PlotModel plotModel; public Form3() { InitializeComponent(); CreateBarChart(); } private void CreateBarChart() { // 创建PlotModel plotModel = new PlotModel { Title = "销售数据分析", TitleFontSize = 16, TitleColor = OxyColors.Black }; // 创建柱状图序列 var series1 = new LinearBarSeries { Title = "电子产品", FillColor = OxyColors.Blue, StrokeColor = OxyColors.Black, StrokeThickness = 1 }; var series2 = new LinearBarSeries { Title = "软件服务", FillColor = OxyColors.Green, StrokeColor = OxyColors.Black, StrokeThickness = 1 }; // 添加数据点 series1.Points.Add(new DataPoint(0, 120.5)); series1.Points.Add(new DataPoint(1, 150.3)); series1.Points.Add(new DataPoint(2, 200.7)); series1.Points.Add(new DataPoint(3, 180.2)); series2.Points.Add(new DataPoint(0, 85.3)); series2.Points.Add(new DataPoint(1, 95.6)); series2.Points.Add(new DataPoint(2, 110.4)); series2.Points.Add(new DataPoint(3, 130.1)); // 创建类别轴 var xAxis = new CategoryAxis { Position = AxisPosition.Bottom, Title = "城市", Key = "CityAxis" }; xAxis.Labels.Add("北京"); xAxis.Labels.Add("上海"); xAxis.Labels.Add("广州"); xAxis.Labels.Add("深圳"); // 创建数值轴 var yAxis = new LinearAxis { Position = AxisPosition.Left, Title = "销售额 (万元)", Minimum = 0 }; // 添加轴和序列到模型 plotModel.Axes.Add(xAxis); plotModel.Axes.Add(yAxis); plotModel.Series.Add(series1); plotModel.Series.Add(series2); plotView1.Model = plotModel; } } }

image.png

结论

OxyPlot提供了丰富的功能来创建和自定义柱状图。通过本指南中的例子,您应该能够在WinForms应用程序中创建各种类型的柱状图,并根据需要自定义它们的外观和行为。记住,OxyPlot的功能远不止于此,您可以进一步探索其他图表类型和高级功能。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!