-
C# 파이 차트는 사실 아주 간단한 것인데, 네트워크상의 어떤 제어로도 구현할 수 없는 기능을 구현하고 싶어서 게시한 것입니다.
거의 하루 동안 인터넷을 검색한 끝에 어지러웠지만 결과는 정말 실망스러웠습니다. 분노에 차서 직접 그렸는데, 3시간 밖에 걸리지 않았으면 좋겠습니다.
도움이 필요한 친구들에게 도움을 주고 우회를 피하세요. 지식은 공유에 있으며 모두가 함께 발전할 수 있습니다. 더 이상 말도 안되는 코드는 다음과 같습니다.
C#.Net 2005 환경 및 XP 운영 체제의 경우 동적 표시를 위해 데이터베이스에 연결해야 하는 경우 전달된 DataTable만 변경하면 됩니다.
위에 언급이 없습니다. 저는 그것이 매우 간단하다고 생각했기 때문에 그것을 주의 깊게 읽으면 매우 간단할 것이라고 믿습니다.
먼저 aspx 파일을 만들고 다음 코드를 게시하세요. 빨간색 부분은 원하는 파일 이름으로 변경할 수 있습니다.
시스템 사용;
System.Collections 사용;
System.ComponentModel 사용;
System.Data 사용;
System.드로잉 사용;
System.Web 사용;
System.Web.UI 사용;
System.Web.UI.WebControls 사용;
System.Web.UI.HtmlControls 사용;
System.드로잉.드로잉2D 사용;
System.드로잉.이미징 사용;
System.IO 사용;
공개 부분 클래스 Test_Chart : System.Web.UI.Page
{
protected void Page_Load(개체 전송자, EventArgs e)
{
//페이지를 초기화하려면 여기에 사용자 코드를 입력하세요.
MemoryStream 스트림 = new MemoryStream();
MemoryStream columnarStream = new MemoryStream();
비트맵 그래프 = null;
DataTable dt = new 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);
graph = GetPieGraph("각 그룹의 Compex 실패율 통계",600,500,100,30,dt);
graph.Save(stream, ImageFormat.Jpeg);
//사진 출력
응답.지우기();
Response.ContentType = "이미지/jpeg";
Response.BinaryWrite(stream.ToArray());
}
protected Bitmap GetPieGraph(문자열 제목, int 너비, int 높이, int 왼쪽, int 상단, DataTable gdt)
{
비트맵 objbitmap = new Bitmap(너비, 높이);
그래픽 객체 그래픽;
objgraphics = Graphics.FromImage(objbitmap);
objgraphics.Clear(Color.White);
StringFormat drawformat = new System.드로잉.StringFormat(StringFormatFlags.DirectionVertical);
StringFormat drawformat1 = new System.드로잉.StringFormat(StringFormatFlags.DisplayFormatControl);
objgraphics.DrawString(title, new Font("宋体", 16),Brushes.Black, 150, 5, drawformat1);
PointF 기호다리 = new PointF(왼쪽, 높이-상단-45);
PointF descleg = new PointF(왼쪽 + 20, 높이 - 위쪽 - 45);
//테두리 그리기
objgraphics.DrawRectangle(Pens.Black, 0, 0, 너비-1, 높이-1);
//사진 내의 작은 프레임
int h = gdt.Rows.Count / 4;
if (gdt.Rows.Count % 4 > 0)
{
h = h + 1;
}
objgraphics.DrawRectangle(Pens.Black, 왼쪽-10, 높이-상단-50,gdt.Rows.Count*70+10,20*h);
//어떤 색이 무엇을 나타내는지 보여줍니다.
for (int i = 0; i < gdt.Rows.Count; i++)
{
if (i >= 4 && (i+1)%4==1)
{
기호leg.Y += 20;
descleg.Y += 20;
기호leg.X = 왼쪽;
descleg.X = 왼쪽 + 20;
}
objgraphics.FillRectangle(new SolidBrush(getcolor(i)), 기호leg.X, 기호leg.Y, 12, 10);
objgraphics.DrawRectangle(Pens.Black, 기호leg.X, 기호leg.Y, 12, 10);
objgraphics.DrawString(gdt.Rows[i][0].ToString().Trim(), new Font("宋体", 10), Brushes.Black, descleg);
기호leg.X += 100;
descleg.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)), 왼쪽+50, 위쪽+30, 300, 300, sgltotalangle, sglcurrentangle);
objgraphics.DrawPie(Pens.Black, 왼쪽 + 50, 위쪽 + 30,300, 300, sgltotalangle, sglcurrentangle);
//반경 r
더블 r = 300 / 2;
//원 중심 위치:
더블 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;
//원 중심 위치:
더블 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(왼쪽 + 50+150, 위쪽 + 30+150,300,sgltotalangle, sglcurrentangle,arrvalues[i].ToString());
sgltotalangle += sglcurrentangle;
}
objbitmap을 반환합니다.
}
protected void GetLet(int startX, int startY, 이중 직경, 이중 totalAngle, 이중 currentAngle, 문자열 다리)
{
이중 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);
}
보호된 색상 getcolor(int itemindex)
{
색상 개체색상;
if (항목 인덱스 >= 14)
{
아이템 인덱스 = 아이템 인덱스 % 14;
}
if (항목 인덱스 == 0)
{
objcolor = Color.DarkMagenta;
}
else if (항목 인덱스 == 1)
{
objcolor = Color.MediumAquamarine;
}
else if (항목 인덱스 == 2)
{
objcolor = Color.DeepSkyBlue;
}
else if (항목 인덱스 == 3)
{
objcolor = Color.DarkRed;
}
else if (항목 인덱스 == 4)
{
objcolor = 컬러.핑크;
}
else if (항목 인덱스 == 5)
{
objcolor = Color.Salmon;
}
else if (항목 인덱스 == 6)
{
objcolor = 컬러.카키;
}
else if (항목 인덱스 == 7)
{
objcolor = Color.Maroon;
}
else if (항목 인덱스 == 8)
{
objcolor = Color.LawnGreen;
}
else if (항목 인덱스 == 9)
{
objcolor = Color.LightGoldenrodYellow;
}
else if (항목 인덱스 == 10)
{
objcolor = Color.Moccasin;
}
else if (항목 인덱스 == 11)
{
objcolor = Color.YellowGreen;
}
else if (항목 인덱스 == 12)
{
objcolor = Color.DarkCyan;
}
else if (항목 인덱스 == 13)
{
objcolor = Color.SteelBlue;
}
else if (항목 인덱스 == 14)
{
objcolor = Color.Tomato;
}
또 다른
{
objcolor = Color.SlateGray;
}
objcolor를 반환합니다.
}
}