OxyPlot是一个强大的跨平台绘图库,可以在WinForms应用程序中创建高质量的图表。本指南将重点介绍如何使用OxyPlot在WinForms中创建各种类型的柱状图。
环境设置
首先,您需要在您的WinForms项目中安装OxyPlot。您可以通过NuGet包管理器安装以下包:
- OxyPlot.Core
- OxyPlot.WindowsForms
图片
在Visual Studio中,右键点击您的项目,选择"管理NuGet包",然后搜索并安装这两个包。
安装完成后,在您的代码中添加以下using语句:
using OxyPlot;
using OxyPlot.Series;
using OxyPlot.WindowsForms;
基础柱状图
让我们从一个简单的柱状图开始。
- 在代码中,创建一个PlotModel和BarSeries,然后将数据添加到系列中。
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;
}
}
}
图片
这将创建一个简单的柱状图,包含5个数据点。
多系列柱状图
要创建包含多个系列的柱状图,只需添加多个BarSeries到模型中。
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();
}
}
}
图片
堆叠柱状图
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;
}
}
}
图片
结论
OxyPlot提供了丰富的功能来创建和自定义柱状图。通过本指南中的例子,您应该能够在WinForms应用程序中创建各种类型的柱状图,并根据需要自定义它们的外观和行为。记住,OxyPlot的功能远不止于此,您可以进一步探索其他图表类型和高级功能。