Asp.Net实例:C# 绘制统计图(一) ——柱状图

2023-11-02

                     Asp.Net实例:C# 绘制统计图

                          (柱状图, 折线图, 扇形图)

 
        统计图形种类繁多, 有柱状图, 折线图, 扇形图等等, 而统计图形的绘制方法也有很多, Flash制作的统计图形, 有水晶报表生成统计图形, 有专门制图软件制作, 也有编程语言自己制作的;这里我们用就C# 制作三款最经典的统计图: 柱状图, 折线图和扇形图;既然是统计, 当然需要数据, 这里演示的数据存于Sql Server2000, 三款统计图形都是动态生成. 其中柱状图我会附上制作步骤, 其他两款统计图直接附源码.
  说明: 需求不一样, 统计图形绘制后的显示效果也不一样, 比如这里柱状图的主要需求是为了比较每一期报名人数与通过人数的差, 因此会把两根柱子放在一起会使比较结果一目了然. 因此大家可以根据需要灵活绘制.
 
. 柱状图的绘制.
绘制步骤如下:
1. 定义绘图用到的类.
定义绘图类
int height = 500, width = 700;
Bitmap p_w_picpath = new Bitmap(width, height);
Graphics g = Graphics.FromImage(p_w_picpath);
Pen mypen = new Pen(brush, 1);
2. 绘制图框.
绘制图框
g.FillRectangle(Brushes.WhiteSmoke, 0, 0, width, height);
3. 绘制横向坐标线
绘制横向坐标线
for (int i = 0; i < 14; i++)
{
g.DrawLine(mypen, x, 80, x, 340);
x = x + 40;
}
4. 绘制纵向坐标线
绘制纵向坐标线
for (int i = 0; i < 9; i++)
{
g.DrawLine(mypen, 60, y, 620, y);
y = y + 26;
}
5. 绘制横坐标值
绘制横坐标值
String[] n = { "第一期", "第二期", "第三期", "第四期", "全年" };
for (int i = 0; i < 7; i++)
{
g.DrawString(n[i].ToString(), font, Brushes.Blue, x, 348);
x = x + 78;
}
6. 绘制纵坐标值
绘制纵坐标
String[] m = {"250","225", "200", "175", "150", "125", "100“};
for (int i = 0; i < 10; i++)
{
g.DrawString(m[i].ToString(), font, Brushes.Blue, 25, y);
y = y + 26;
}

7. 定义数组存储数据库中统计的数据
定义存储统计数据的数组
int[] Count1 = new int[7]; //存储从数据库读取的报名人数
int[] Count2 = new int[7]; //存储从数据库读取的通过人数
8. 从数据库中读取报名人数与通过人数
读取数据
SqlConnection Con = new SqlConnection(
"Server=(Local);Database=committeeTraining;");
Con.Open();
string cmdtxt2 = "SELECT * FROM ##Count
where Company='" + ****+ "'";
SqlDataAdapter da = new SqlDataAdapter(cmdtxt2, Con);
DataSet ds = new DataSet();
da.Fill(ds);
9. 将读取的数据存储到数组中
将数据存储到数组中
Count1[0] = Convert.ToInt32(ds.Tables[0].Rows[0][“count1”].ToString());
Count1[1] = Convert.ToInt32(ds.Tables[0].Rows[0][“count3”].ToString());
Count2[0] = Convert.ToInt32(ds.Tables[0].Rows[0][“count2”].ToString());
Count2[1] = Convert.ToInt32(ds.Tables[0].Rows[0]["count4"].ToString());
10.定义画笔和画刷准备绘图
准备绘制柱状图
x = 80;
Font font2 = new System.Drawing.Font(
"Arial", 10, FontStyle.Bold);
SolidBrush mybrush = new SolidBrush(Color.Red);
SolidBrush mybrush2 = new SolidBrush(Color.Green);
11. 根据数组中的值绘制柱状图

绘制柱状图
(1)第一期报名人数
g.FillRectangle(mybrush, x, 340 - Count1[0], 20, Count1[0]);
g.DrawString(Count1[0].ToString(), font2,
Brushes.Red, x, 340 - Count1[0] - 15);
(2) 第一期通过人数
x = x + 20;
g.FillRectangle(mybrush2, x, 340 - Count2[0], 20, Count2[0]);
g.DrawString(Count2[0].ToString(), font2,
Brushes.Green, x, 340 - Count2[0] - 15);
12. 将图形输出到页面.
将页面输出到页中
System.IO.MemoryStream ms = new
System.IO.MemoryStream();
p_w_picpath.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
Response.ClearContent();
Response.ContentType = "p_w_picpath/Jpeg";
Response.BinaryWrite(ms.ToArray());
最终柱状图的效果图:
 
           

 

 

柱状图的完整代码 :
绘制柱状统计图的完整代码
private void CreateImage()
{
int height = 500, width = 700;
Bitmap p_w_picpath = new Bitmap(width, height);
//
创建 Graphics 类对象
Graphics g = Graphics.FromImage(p_w_picpath);
try
{
//
清空图片背景色
g.Clear(Color.White);
Font font = new Font("Arial", 10, FontStyle.Regular);
Font font1 = new Font("
宋体 ", 20, FontStyle.Bold);
LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, p_w_picpath.Width, p_w_picpath.Height),
Color.Blue, Color.BlueViolet, 1.2f, true);
g.FillRectangle(Brushes.WhiteSmoke, 0, 0, width, height);
// Brush brush1 = new SolidBrush(Color.Blue);
g.DrawString(this.ddlTaget.SelectedItem.Text + " " + this.ddlYear.SelectedItem.Text +
"
成绩统计柱状图 ", font1, brush, new PointF(70, 30));
//
画图片的边框线
g.DrawRectangle(new Pen(Color.Blue), 0, 0, p_w_picpath.Width - 1, p_w_picpath.Height - 1);

Pen mypen = new Pen(brush, 1);
//
绘制线条
// 绘制横向线条
int x = 100;
for (int i = 0; i < 14; i++)
{
g.DrawLine(mypen, x, 80, x, 340);
x = x + 40;
}
Pen mypen1 = new Pen(Color.Blue, 2);
x = 60;
g.DrawLine(mypen1, x, 80, x, 340);
// 绘制纵向线条
int y = 106;
for (int i = 0; i < 9; i++)
{
g.DrawLine(mypen, 60, y, 620, y);
y = y + 26;
}
g.DrawLine(mypen1, 60, y, 620, y);
//x
String[] n = { " 第一期 ", " 第二期 ", " 第三期 ", " 第四期 ", " 上半年 ", " 下半年 ", " 全年统计 " };
x = 78;
for (int i = 0; i < 7; i++)
{
g.DrawString(n[i].ToString(), font, Brushes.Blue, x, 348); //
设置文字内容及输出位置
x = x + 78;
}
//y
String[] m = {"250","225", "200", "175", "150", "125", "100", " 75",
" 50", " 25", " 0"};
y = 72;
for (int i = 0; i < 10; i++)
{
g.DrawString(m[i].ToString(), font, Brushes.Blue, 25, y); //
设置文字内容及输出位置
y = y + 26;
}
int[] Count1 = new int[7];
int[] Count2 = new int[7];
SqlConnection Con = new SqlConnection("Server=(Local);Database=committeeTraining;Uid=sa;Pwd=**");
Con.Open();
string cmdtxt2 = "SELECT * FROM ##Count where Company='" + this.ddlTaget.SelectedItem.Text.Trim() + "'";
SqlDataAdapter da = new SqlDataAdapter(cmdtxt2, Con);
DataSet ds = new DataSet();
da.Fill(ds);
Count1[0] = Convert.ToInt32(ds.Tables[0].Rows[0]["count1"].ToString());
Count1[1] = Convert.ToInt32(ds.Tables[0].Rows[0]["count3"].ToString());
Count1[2] = Convert.ToInt32(ds.Tables[0].Rows[0]["count5"].ToString());
Count1[3] = Convert.ToInt32(ds.Tables[0].Rows[0]["count7"].ToString());
Count1[4] = Count1[0] + Count1[1];
Count1[5] = Count1[2] + Count1[3];
Count1[6] = Convert.ToInt32(ds.Tables[0].Rows[0]["count9"].ToString());

Count2[0] = Convert.ToInt32(ds.Tables[0].Rows[0]["count2"].ToString());
Count2[1] = Convert.ToInt32(ds.Tables[0].Rows[0]["count4"].ToString());
Count2[2] = Convert.ToInt32(ds.Tables[0].Rows[0]["count6"].ToString());
Count2[3] = Convert.ToInt32(ds.Tables[0].Rows[0]["count8"].ToString());
Count2[4] = Count2[0] + Count2[1];
Count2[5] = Count2[2] + Count2[3];
Count2[6] = Convert.ToInt32(ds.Tables[0].Rows[0]["count10"].ToString());
// 绘制柱状图 .
x = 80;
Font font2 = new System.Drawing.Font("Arial", 10, FontStyle.Bold);
SolidBrush mybrush = new SolidBrush(Color.Red);
SolidBrush mybrush2 = new SolidBrush(Color.Green);
// 第一期
g.FillRectangle(mybrush, x, 340 - Count1[0], 20, Count1[0]);
g.DrawString(Count1[0].ToString(), font2, Brushes.Red, x, 340 - Count1[0] - 15);
x = x + 20;
g.FillRectangle(mybrush2, x, 340 - Count2[0], 20, Count2[0]);
g.DrawString(Count2[0].ToString(), font2, Brushes.Green, x, 340 - Count2[0] - 15);

// 第二期
x = x + 60;
g.FillRectangle(mybrush, x, 340 - Count1[1], 20, Count1[1]);
g.DrawString(Count1[1].ToString(), font2, Brushes.Red, x, 340 - Count1[1] - 15);

x = x + 20;
g.FillRectangle(mybrush2, x, 340 - Count2[1], 20, Count2[1]);
g.DrawString(Count2[1].ToString(), font2, Brushes.Green, x, 340 - Count2[1] - 15);

// 第三期
x = x + 60;
g.FillRectangle(mybrush, x, 340 - Count1[2], 20, Count1[2]);
g.DrawString(Count1[2].ToString(), font2, Brushes.Red, x, 340 - Count1[2] - 15);
x = x + 20;
g.FillRectangle(mybrush2, x, 340 - Count2[2], 20, Count2[2]);
g.DrawString(Count2[2].ToString(), font2, Brushes.Green, x, 340 - Count2[2] - 15);
// 第四期
x = x + 60;
g.FillRectangle(mybrush, x, 340 - Count1[3], 20, Count1[3]);
g.DrawString(Count1[3].ToString(), font2, Brushes.Red, x, 340 - Count1[3] - 15);
x = x + 20;
g.FillRectangle(mybrush2, x, 340 - Count2[3], 20, Count2[3]);
g.DrawString(Count2[3].ToString(), font2, Brushes.Green, x, 340 - Count2[3] - 15);
// 上半年
x = x + 60;
g.FillRectangle(mybrush, x, 340 - Count1[4], 20, Count1[4]);
g.DrawString(Count1[4].ToString(), font2, Brushes.Red, x, 340 - Count1[4] - 15);
x = x + 20;
g.FillRectangle(mybrush2, x, 340 - Count2[4], 20, Count2[4]);
g.DrawString(Count2[4].ToString(), font2, Brushes.Green, x, 340 - Count2[4] - 15);
// 下半年
x = x + 60;
g.FillRectangle(mybrush, x, 340 - Count1[5], 20, Count1[5]);
g.DrawString(Count1[5].ToString(), font2, Brushes.Red, x, 340 - Count1[5] - 15);
x = x + 20;
g.FillRectangle(mybrush2, x, 340 - Count2[5], 20, Count2[5]);
g.DrawString(Count2[5].ToString(), font2, Brushes.Green, x, 340 - Count2[5] - 15);
// 全年
x = x + 60;
g.FillRectangle(mybrush, x, 340 - Count1[6], 20, Count1[6]);
g.DrawString(Count1[6].ToString(), font2, Brushes.Red, x, 340 - Count1[6] - 15);

x = x + 20;
g.FillRectangle(mybrush2, x, 340 - Count2[6], 20, Count2[6]);
g.DrawString(Count2[6].ToString(), font2, Brushes.Green, x, 340 - Count2[6] - 15);

// 绘制标识
Font font3 = new System.Drawing.Font("Arial", 10, FontStyle.Regular);
g.DrawRectangle(new Pen(Brushes.Blue), 170, 400, 250, 50); //
绘制范围框
g.FillRectangle(Brushes.Red, 270, 410, 20, 10); // 绘制小矩形
g.DrawString(" 报名人数 ", font3, Brushes.Red, 292, 408);
g.FillRectangle(Brushes.Green, 270, 430, 20, 10);
g.DrawString("
通过人数 ", font3, Brushes.Green, 292, 428);
System.IO.MemoryStream ms = new System.IO.MemoryStream();
p_w_picpath.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
Response.ClearContent();
Response.ContentType = "p_w_picpath/Jpeg";
Response.BinaryWrite(ms.ToArray());
}
finally
{
g.Dispose();
p_w_picpath.Dispose();
}
}
 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Asp.Net实例:C# 绘制统计图(一) ——柱状图 的相关文章

  • 如何在ASP.NET中用OWC绘制图表

    Version 1 0 StartHTML 000000201 EndHTML 000096358 StartFragment 000002217 EndFragment 000096290 StartSelection 000002217
  • MS Chart 控件学习(一)常见属性

    最常用的属性包括 ChartAreas 增加多个绘图区域 每个绘图区域包含独立的图表组 数据源 用于多个图表类型在一个绘图区不兼容时 AlignmentOrientation 图表区对齐方向 定义两个绘图区域间的对齐方式 Alignment
  • Microsoft Chart堆积柱形图有间隙

    我正在使用 Net 4 0 中的图表库来创建包含多个系列的堆叠柱形图 我的目标是一个直方图 显示多个系列 教师 每天的累积操作数 报告完成情况 经常会丢失数据 特定教师当天没有活动 当系列中缺少数据时 我会在条形图中出现间隙 My code
  • 在 C# 中向图表添加水平线

    我正在使用一个System Windows Forms DataVisualization Chart绘制一些 x y 散点数据 如下所示 chart1 Series Series2 Points AddXY stringX doubleY
  • 将图表坐标转换为像素

    我应该在极坐标图中画一个圆圈 上面有一些文字 我开始使用 PostPaint 获得了图表图形 因此我能够在上面绘制和编写自定义内容 我的主要问题是位置 例如 我想在 x 和 y 轴交叉的地方绘制 sg 但我没有找到任何有效的方法将图形坐标
  • 绘制重叠柱形图或条形图

    我需要使用柱形或条形类型将 4 个系列数据绘制到 MSChart 我可以绘制这 4 个系列 以便数据重叠而不是堆叠 我刚刚发现有一个ChartGroup OverlapOffice Excel 的属性 我该如何在 MSChart 中做到这一
  • 如何控制winform mschart图例文本对齐c#?

    如何设置图表图例对象中的文本对齐方式 我尝试过使用 myChartName Legends mySeriesName Alignment stringAlignment Near 没有效果 我还尝试创建自定义图例项目 同样没有效果 文本始终
  • MSChart / Asp.net 图表不显示工具提示

    我有一个仪表板页面 我在其中使用各种 MSCharts 我为每个图表定义了一个类 当我运行每个图表类并定义其系列属性时 我在该图表中定义系列的工具提示 如下所示 Series 0 ToolTip Date VALX d nTotal Qty
  • 如何让用户在 MSChart 上创建注释?

    如何在运行中创建注释以及如何启用最终用户放置Annotation BeginPlacement 我尝试以多种方式做到这一点 但无法使其发挥作用 在调用 BeginPlacement 后 它应该实时呈现自身 关于这个主题的文档几乎没有 而且大
  • 如果 MS Chart Control 没有数据,我可以显示消息吗?

    如果没有要绘制图表的数据 是否有办法在 MS 图表控件上显示 默认 消息 我有一个图表 其中包含一些控件 允许用户选择各种日期范围 如果在该日期范围内没有要绘制图表的数据 则当前仅显示任何内容 或者至少显示图例和背景 仅此而已 我希望有一条
  • 如何使用主题文件自定义 ASP.NET 图表

    我想创建一个折线图 其中 x 轴是日期 y 轴上有绿色 0 位置 黄色 1 和红色 2 的位置 我怎样才能做到这一点 目前只有数字 我用 XML 尝试过 但我对它了解不多 而且有点令人困惑 我可以用它访问 y 轴的单个元素并将它们转换为文本
  • 使用 mschart 在数据点上设置标签

    我想自定义下面数据点上的标签 以便它们呈现为 使用图表上的第一个数据点作为示例 4 10 4 40 黄色类 数据点有一个可以通过编程方式设置的标签属性 DataPoint dp new DataPoint dp Label c Start
  • Microsoft Chart 堆叠列与非堆叠列分组

    我希望显示 4 组的数据 每组有 1 个堆叠列和 1 个非堆叠列 这是我所追求的模型 获得四个组很容易 这给了我我想要的 Series series chart Series Add Budget series ChartType Seri
  • C#图表控件删除条形图中条形之间的空格

    I have a bar chart made with the c net chart control that looks like the following 正如您所看到的 图表上每对红色和蓝色条之间都有一个空格 有没有办法删除这些
  • 如何将图像设置为图表轴或沿图表轴设置?

    我正在尝试使用彩色光谱带作为图表的轴 这个想法是将图像上的颜色与其沿底部 x 轴相关的波长相匹配 条带需要更改大小以匹配图表区域的变化 并扩展和收缩部分以匹配图表区域中的滚动缩放 我尝试过使用图像注释 但随着图表区域的变化 注释尺寸保持固定
  • C#:如何在 ASP.Net 条形图中交叉绘制条形图

    我有一个 asp net 条形图 我正在尝试向其中一个条形图添加剖面线 我不知道该怎么做 我想对图表中的第四个条形 从左起 绘制剖面线 我尝试了下面的代码 但它不起作用 Chart1 Series Actual Points 3 Color
  • 更改 mschart 轴上的日期时间格式

    我正在使用 mschart 显示一段时间内的一些值 它看起来像这样 正如您所看到的 第一个值是从 15 11 开始 最后一个值是从 16 10 开始 但在 x 轴上它显示的是日期 我怎样才能改变这个 编辑 将 XValueType 更改为
  • 微软图表:透明度

    我想要一个具有透明背景的图表 因此 PNG 似乎是一个不错的选择 但是当我设置透明背景时 轴标签的质量急剧下降 我该如何解决 请参阅以下代码 就目前情况而言 图表具有透明背景 正如我所希望的那样 但文本质量很差 如果我注释掉两个 Color
  • MS Chart控件缩放MinSize问题

    我正在使用 MS Chart Control NET 3 5 WinForms C 实现散点图 我的 x 轴数据是 DateTime 并注意到我无法放大小于 1 天的分辨率 尽管按如下方式设置 ScaleView chart1 ChartA
  • MSChart 控件中的自定义 X/Y 网格线

    我有一个带有简单 2D 折线图的 C Windows 窗体 我想向其中添加自定义 X 或 Y 轴标记 并绘制自定义网格线 例如 以突出显示的颜色 虚线 我查看了 customLabels 属性 但这似乎覆盖了我仍然想显示的默认网格 这是为了

随机推荐