-
C#円グラフは実はとても簡単なもので、ネットワーク上のどの制御でも実現できない機能を実装したいと思ったので投稿しました。
ほぼ 1 日かけてインターネットで検索した後、結果は本当に残念でした。怒りに駆られて自分で絵を描きました。3 時間しかかからなかったと思います。
困っている友達に助けをもたらし、寄り道を避けましょう。知識を共有すれば、誰もが一緒に進歩することができます。コードは次のとおりです。
C#.Net 2005 環境および XP オペレーティング システムの場合、動的表示のためにデータベースに接続する必要がある場合は、渡された DataTable を変更するだけで済みます。
上記の説明は非常に簡単だと思ったので、よく読んでいただければ非常に簡単だと思います。
まず、aspx ファイルを作成し、次のコードを投稿します。赤い部分は独自のファイル名に変更できることに注意してください。
システムを使用する;
System.Collections を使用します。
System.ComponentModel を使用します。
System.Data を使用します。
System.Drawing を使用します。
System.Web を使用します。
System.Web.UI を使用します。
System.Web.UI.WebControls を使用します。
System.Web.UI.HtmlControls を使用します。
System.Drawing.Drawing2D を使用します。
System.Drawing.Imaging を使用します。
System.IO を使用します。
パブリック部分クラス Test_Chart : System.Web.UI.Page
{
protected void Page_Load(オブジェクト送信者, EventArgs e)
{
//ここにユーザーコードを入力してページを初期化します
MemoryStream ストリーム = new MemoryStream();
MemoryStream columnarStream = new MemoryStream();
ビットマップ グラフ = null;
DataTable dt = 新しい DataTable();
dt.Columns.Add("Ven", typeof(System.String));
dt.Columns.Add("BadQty", typeof(System.Int32));
dt.Rows.Add("威海、山東", 65);
dt.Rows.Add("安徽省黄山",23);
dt.Rows.Add("江蘇太湖",34);
dt.Rows.Add("陝西省華山",98);
dt.Rows.Add("湖南省井港山",102);
dt.Rows.Add("海南南海",74);
chart = GetPieGraph("各グループの複合故障率統計",600,500,100,30,dt);
グラフ.Save(ストリーム, ImageFormat.Jpeg);
//画像出力
Response.Clear();
Response.ContentType = "画像/jpeg";
Response.BinaryWrite(stream.ToArray());
}
protected Bitmap GetPieGraph(string title, int width, int height, int left, int top, DataTable gdt)
{
ビットマップ objbitmap = 新しいビットマップ(幅, 高さ);
グラフィックスオブジェクトグラフィックス。
objgraphics = Graphics.FromImage(objbitmap);
objgraphics.Clear(Color.White);
StringFormatdrawformat = new System.Drawing.StringFormat(StringFormatFlags.DirectionVertical);
StringFormatdrawformat1 = new System.Drawing.StringFormat(StringFormatFlags.DisplayFormatControl);
objgraphics.DrawString(title, new Font("宋体", 16),Brushes.Black, 150, 5,drawformat1);
PointF シンボル脚 = 新しい PointF(left, height-top-45);
PointF descleg = 新しい PointF(左 + 20、高さ - 上 - 45);
//枠線を描く
objgraphics.DrawRectangle(Pens.Black, 0, 0, width-1, height-1);
//画像内の小さなフレーム
int h = gdt.Rows.Count / 4;
if (gdt.Rows.Count % 4 > 0)
{
h = h + 1;
}
objgraphics.DrawRectangle(Pens.Black, left-10, height-top-50,gdt.Rows.Count*70+10,20*h);
// どの色が何を表しているかを表示
for (int i = 0; i < gdt.Rows.Count; i++)
{
if (i >= 4 && (i+1)%4==1)
{
シンボル脚.Y += 20;
deslegg.Y += 20;
シンボル脚.X = 左;
desleg.X = 左 + 20;
}
objgraphics.FillRectangle(new SolidBrush(getcolor(i))、symbolleg.X、symbolleg.Y、12、10);
objgraphics.DrawRectangle(Pens.Black、symbolleg.X、symbolleg.Y、12、10);
objgraphics.DrawString(gdt.Rows[i][0].ToString().Trim(), new Font("宋体", 10), Brushes.Black, descleg);
シンボル脚.X += 100;
deslegg.X += 100;
}
float sglcurrentangle = 0;
float sgltotalangle = 0;
float sgltotalvalues = 0;
for (int i = 0; i < gdt.Rows.Count; i++)
{
sgltotalvalues += float.Parse(gdt.Rows[i][1].ToString().Trim());
}
for (int i = 0; i < gdt.Rows.Count; i++)
{
sglcurrentangle = float.Parse(gdt.Rows[i][1].ToString().Trim()) / sgltotalvalues * 360;
objgraphics.FillPie(new SolidBrush(getcolor(i))、left+50、top+30、300、300、sgltotalangle、sglcurrentangle);
objgraphics.DrawPie(Pens.Black、左 + 50、上 + 30,300、300、sgltotalangle、sglcurrentangle);
//半径r
二重 r = 300 / 2;
//円の中心位置:
double cX = 左 + 50 + r;
ダブル cY = トップ + 30 + r;
//円上の点の座標:
double dX = r * Math.Cos((360 - sgltotalangle - sglcurrentangle / 2) * 3.14 / 180);
double dY = r * Math.Sin((360 - sgltotalangle - sglcurrentangle / 2) * 3.14 / 180);
//円上の位置:
ダブル dcX = cX + dX;
ダブル dcY = cY - dY;
//半径r
二重 r1 = 350 / 2;
//円の中心位置:
double cX1 = 左 + 50 + r;
ダブル cY1 = トップ + 30 + r;
//円上の点の座標:
double dX1 = r1 * Math.Cos((360 - sgltotalangle - sglcurrentangle / 2) * 3.14 / 180);
double dY1 = r1 * Math.Sin((360 - sgltotalangle - sglcurrentangle / 2) * 3.14 / 180);
//円上の位置:
ダブル dcX1 = cX1 + dX1;
ダブル dcY1 = cY1 - dY1;
objgraphics.DrawLine(Pens.Black,Convert.ToInt32(dcX) ,Convert.ToInt32(dcY),Convert.ToInt32(dcX1), Convert.ToInt32(dcY1));
if (dX1 >= 0 && dY1 >= 0)
{
objgraphics.DrawString(gdt.Rows[i][0].ToString().Trim(), new Font("宋体", 10), Brushes.Black, Convert.ToInt32(dcX1), Convert.ToInt32(dcY1 - 5) ));
}
if (dX1 <= 0 && dY1 >= 0)
{
objgraphics.DrawString(gdt.Rows[i][0].ToString().Trim(), new Font("宋体", 10), Brushes.Black, Convert.ToInt32(dcX1 - 25), Convert.ToInt32(dcY1) - 15));
}
if (dX1 <= 0 && dY1 <= 0)
{
objgraphics.DrawString(gdt.Rows[i][0].ToString().Trim(), new Font("宋体", 10), Brushes.Black, Convert.ToInt32(dcX1 - 30), Convert.ToInt32(dcY1) ));
}
if (dX1 >= 0 && dY1 <= 0)
{
objgraphics.DrawString(gdt.Rows[i][0].ToString().Trim(), new Font("宋体", 10), Brushes.Black, Convert.ToInt32(dcX1), Convert.ToInt32(dcY1)) ;
}
//GetLet(left + 50+150, top + 30+150,300,sgltotalangle, sglcurrentangle,arrvalues[i].ToString());
sgltotalangle += sglcurrentangle;
}
objbitmap を返します。
}
protected void GetLet(int startX, int startY, double dia, double totalAngle, double currentAngle, string Leg)
{
二重 x = 0;
二重 y = 0;
二重 r = 直径 / 2;
x = r * Math.Cos((360 - totalAngle - currentAngle / 2) * 3.14 / 180);
y = r * Math.Sin((360 - totalAngle - currentAngle / 2) * 3.14 / 180);
}
protected Color getcolor(int itemindex)
{
カラーオブジェクトの色;
if (アイテムインデックス >= 14)
{
アイテムインデックス = アイテムインデックス % 14;
}
if (アイテムインデックス == 0)
{
objcolor = Color.DarkMagenta;
}
else if (itemindex == 1)
{
objcolor = Color.MediumAquamarine;
}
else if (itemindex == 2)
{
objcolor = Color.DeepSkyBlue;
}
else if (itemindex == 3)
{
objcolor = Color.DarkRed;
}
else if (itemindex == 4)
{
objcolor = カラー.ピンク;
}
else if (itemindex == 5)
{
objcolor = Color.Salmon;
}
else if (itemindex == 6)
{
objcolor = Color.カーキ;
}
else if (itemindex == 7)
{
objcolor = Color.Maroon;
}
else if (itemindex == 8)
{
objcolor = Color.LawnGreen;
}
else if (itemindex == 9)
{
objcolor = Color.LightGoldenrodYellow;
}
else if (itemindex == 10)
{
objcolor = カラー.モカシン;
}
else if (itemindex == 11)
{
objcolor = Color.YellowGreen;
}
else if (itemindex == 12)
{
objcolor = Color.DarkCyan;
}
else if (itemindex == 13)
{
objcolor = Color.SteelBlue;
}
else if (itemindex == 14)
{
objcolor = Color.Tomato;
}
それ以外
{
objcolor = Color.SlateGray;
}
objcolor を返します。
}
}