饼状图是一种常用的数据可视化方法,用于显示数据各个部分的占比情况。如何使用C#和Graphics动态生成饼状图报表,并将其嵌入到Windows应用程序中。
首先,需要准备好数据。假设有一个包含各个部分占比的列表,其中每个项包含部分名称和占比。可以通过下面的代码来生成一个随机数据列表:
List<Tuple<string, double>> data = new List<Tuple<string, double>>();
Random random = new Random();
double sum = 0;
for (int i = 1; i <= 5; i++)
{
double value = random.Next(10, 50);
sum += value;
data.Add(new Tuple<string, double>("部分" + i, value));
}
// 计算百分比
foreach (var item in data)
{
item.Item2 = item.Item2 / sum;
}
接下来,需要通过Graphics类来创建一个画布,并在其上绘制饼状图。可以通过下面的代码来实现:
Bitmap bitmap = new Bitmap(400, 400);
Graphics graphics = Graphics.FromImage(bitmap);
需要定义一个起始角度变量,用于确定绘制饼状图的起始角度。代码如下:
double startAngle = -90;
接着,需要根据数据来绘制饼状图。可以通过下面的代码来实现:
SolidBrush[] brushes = { new SolidBrush(Color.Red), new SolidBrush(Color.Yellow), new SolidBrush(Color.Blue), new SolidBrush(Color.Green), new SolidBrush(Color.Orange) };
double angle = 0;
for (int i = 0; i < data.Count; i++)
{
angle = data[i].Item2 * 360;
graphics.FillPie(brushes[i], new Rectangle(100, 50, 200, 200), (float)startAngle, (float)angle);
startAngle += angle;
}
最后,需要将绘制的饼状图转换为图片,并将其嵌入到Windows应用程序中。可以通过下面的代码来实现:
pictureBox1.Image = bitmap;
至此,就完成了一个动态生成的饼状图报表。通过对数据的处理和可视化,能够更好地了解数据占比情况,并更好地进行数据分析和决策。
下面写一个使用实体生成的饼状图例子,首先创建实体:
public class StatCount
{
/// <summary>
/// 名称
/// </summary>
public string name { get; set; }
/// <summary>
/// 数量
/// </summary>
public int count { get; set; }
}
从数据库中查找数据,并将结果填充到实体集合中.然后调用方法.
private void Draw(List<StatCount> list)
{
int width = zpic.Width;
int height = zpic.Height;
System.Drawing.Bitmap image = new System.Drawing.Bitmap(width, height);
//创建Graphics类对象
Graphics g = Graphics.FromImage(image);
Pen p = new Pen(new SolidBrush(Color.Blue));
Point p1 = new Point(0, 0);
Size s = new Size(width, height);
Rectangle trct = new Rectangle(p1, s);
g.FillEllipse(new SolidBrush(Color.Red), trct);
Font font = new Font("宋体", 10, FontStyle.Regular);
int total = list.Sum((w) => { return w.count; });
//写文字
int y = 10;
for (int i = 0; i < list.Count; i++)
{
//画大饼
Color color = ColorIndex(i);
float f = float.Parse(list[i].count.ToString()) / float.Parse(total.ToString());
g.DrawString(list[i].name + " " + list[i].count.ToString(), font, new SolidBrush(color), 0, y);
y = y + 15;
}
zpic.BackgroundImage = image;
}
效果图如下图所示: