-
O gráfico de pizza C# é na verdade uma coisa muito simples. Postei-o porque quero implementar uma função que não pode ser alcançada por nenhum controle na rede.
Depois de pesquisar na Internet por quase um dia, fiquei tonto, mas o resultado foi muito decepcionante. Num acesso de raiva, eu mesmo desenhei um, o que espero que leve apenas três horas.
Leve ajuda aos amigos necessitados e evite desvios O conhecimento está no compartilhamento e todos podem progredir juntos. Ok, chega de bobagens.
Você pode usá-lo diretamente. Para ambiente C#.Net 2005 e sistema operacional XP, se precisar se conectar ao banco de dados para exibição dinâmica, você só precisa alterar o DataTable passado.
Não há comentários acima. Achei que era muito simples, então ignorei. Acredito que, desde que você leia com atenção, deve ser muito simples.
Primeiro crie um arquivo aspx e poste o código a seguir. Observe que a parte vermelha pode ser alterada para o seu próprio nome de arquivo.
usando o sistema;
usando System.Collections;
usando System.ComponentModel;
usando System.Data;
usando System.Drawing;
usando System.Web;
usando System.Web.UI;
usando System.Web.UI.WebControls;
usando System.Web.UI.HtmlControls;
usando System.Drawing.Drawing2D;
usando System.Drawing.Imaging;
usando System.IO;
classe parcial pública Test_Chart: System.Web.UI.Page
{
protegido void Page_Load (remetente do objeto, EventArgs e)
{
//Coloque aqui o código do usuário para inicializar a página
Fluxo MemoryStream = novo MemoryStream();
MemoryStream columnarStream = new MemoryStream();
Gráfico bitmap = nulo;
DataTable dt = new DataTable();
dt.Columns.Add("Ven", typeof(System.String));
dt.Columns.Add("BadQty", typeof(System.Int32));
dt.Rows.Add("Weihai, Shandong", 65);
dt.Rows.Add("Huangshan, Anhui",23);
dt.Rows.Add("Jiangsu Taihu",34);
dt.Rows.Add("Shaanxi Huashan",98);
dt.Rows.Add("Montanha Jinggang, Hunan",102);
dt.Rows.Add("Hainan Nanhai",74);
gráfico = GetPieGraph("Estatísticas de taxa de falha Compex de cada grupo",600,500,100,30,dt);
gráfico.Save(fluxo, ImageFormat.Jpeg);
//Saída de imagem
Response.Clear();
Response.ContentType = "imagem/jpeg";
Response.BinaryWrite(stream.ToArray());
}
GetPieGraph de bitmap protegido (string title, int width, int height, int left, int top, DataTable gdt)
{
Bitmap objbitmap = novo Bitmap(largura, altura);
Objgráficos gráficos;
objgraphics = Graphics.FromImage(objbitmap);
objgraphics.Clear(Color.White);
StringFormat drawformat = new System.Drawing.StringFormat(StringFormatFlags.DirectionVertical);
StringFormat drawformat1 = new System.Drawing.StringFormat(StringFormatFlags.DisplayFormatControl);
objgraphics.DrawString(título, new Font("宋体", 16),Brushes.Black, 150, 5, drawformat1);
Símbolo PointF perna = novo PointF (esquerda, altura superior-45);
PointF descleg = novo PointF(esquerda + 20, altura - topo - 45);
//Desenhe uma borda
objgraphics.DrawRectangle(Pens.Black, 0, 0, largura-1, altura-1);
//Pequeno quadro dentro da imagem
int h=gdt.Rows.Count/4;
se (gdt.Rows.Count % 4 > 0)
{
h = h + 1;
}
objgraphics.DrawRectangle(Pens.Black, left-10, height-top-50,gdt.Rows.Count*70+10,20*h);
//Mostra qual cor representa o que
for (int i = 0; i < gdt.Rows.Count; i++)
{
se (i >= 4 && (i+1)%4==1)
{
símbololeg.Y += 20;
descleg.Y += 20;
símbololeg.X = esquerda;
descleg.X = esquerda + 20;
}
objgraphics.FillRectangle(new SolidBrush(getcolor(i)), symbolleg.X, symbolleg.Y, 12, 10);
objgraphics.DrawRectangle(Pens.Black, símbololeg.X, símbololeg.Y, 12, 10);
objgraphics.DrawString(gdt.Rows[i][0].ToString().Trim(), new Font("宋体", 10), Brushes.Black, descleg);
símbololeg.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)), esquerda+50, topo+30, 300, 300, sgltotalangle, sglcurrentangle);
objgraphics.DrawPie(Pens.Black, esquerda + 50, topo + 30.300, 300, sgltotalangle, sglcurrentangle);
//raio r
duplo r = 300/2;
//Posição central do círculo:
duplo cX = esquerda + 50 + r;
duplo cY = topo + 30 + r;
//As coordenadas do ponto no círculo:
double dX = r * Math.Cos((360 - sgltotalangle - sglcurrentangle / 2) * 3,14/180);
duplo dY = r * Math.Sin((360 - sgltotalangle - sglcurrentangle / 2) * 3,14/180);
//Posição no círculo:
duplo dcX = cX + dX;
duplo dcY = cY - dY;
//raio r
duplo r1 = 350/2;
//Posição central do círculo:
duplo cX1 = esquerda + 50 + r;
duplo cY1 = topo + 30 + r;
//As coordenadas do ponto no círculo:
double dX1 = r1 * Math.Cos((360 - sgltotalangle - sglcurrentangle / 2) * 3,14/180);
double dY1 = r1 * Math.Sin((360 - sgltotalangle - sglcurrentangle / 2) * 3,14/180);
//Posição no círculo:
duplo dcX1 = cX1 + dX1;
duplo dcY1 = cY1 - dY1;
objgraphics.DrawLine(Pens.Black,Convert.ToInt32(dcX) ,Convert.ToInt32(dcY),Convert.ToInt32(dcX1), Convert.ToInt32(dcY1));
se (dX1 >= 0 && dY1 >= 0)
{
objgraphics.DrawString(gdt.Rows[i][0].ToString().Trim(), new Font("宋体", 10), Brushes.Black, Convert.ToInt32(dcX1), Convert.ToInt32(dcY1 - 5 ));
}
se (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));
}
se (dX1 <= 0 && dY1 <= 0)
{
objgraphics.DrawString(gdt.Rows[i][0].ToString().Trim(), new Font("宋体", 10), Brushes.Black, Convert.ToInt32(dcX1 - 30), Convert.ToInt32(dcY1 ));
}
se (dX1 >= 0 && dY1 <= 0)
{
objgraphics.DrawString(gdt.Rows[i][0].ToString().Trim(), new Font("宋体", 10), Brushes.Black, Convert.ToInt32(dcX1), Convert.ToInt32(dcY1)) ;
}
//GetLet(esquerda + 50+150, topo + 30+150.300,sgltotalangle, sglcurrentangle,arrvalues[i].ToString());
sgltotalangle += sglcurrentangle;
}
retornar mapa de objbit;
}
protegido void GetLet(int startX, int startY, double dia, double totalAngle, double currentAngle, string leg)
{
duplo x = 0;
duplo y = 0;
duplo r = dia/2;
x = r * Math.Cos((360 - totalAngle - currentAngle / 2) * 3,14/180);
y = r * Math.Sin((360 - totalAngle - currentAngle / 2) * 3,14/180);
}
Cor protegida getcolor(int itemindex)
{
Cor objetocor;
if (itemíndice >= 14)
{
índice de item = índice de item % 14;
}
if (itemíndice == 0)
{
objcolor = Color.DarkMagenta;
}
senão if (itemindex == 1)
{
objcolor = Color.MediumAquamarine;
}
senão se (itemindex == 2)
{
objcolor = Color.DeepSkyBlue;
}
senão se (itemindex == 3)
{
objcolor = Color.DarkRed;
}
senão se (itemindex == 4)
{
objcolor = Cor.Rosa;
}
senão se (itemindex == 5)
{
objcolor = Cor.Salmon;
}
senão se (itemindex == 6)
{
objcolor = Cor.Khaki;
}
senão se (itemindex == 7)
{
objcolor = Cor.Marrom;
}
senão se (itemindex == 8)
{
objcolor = Color.LawnGreen;
}
senão se (itemindex == 9)
{
objcolor = Color.LightGoldenrodYellow;
}
senão se (itemindex == 10)
{
objcolor = Cor.Mocassim;
}
senão se (itemindex == 11)
{
objcolor = Cor.AmareloVerde;
}
senão se (itemindex == 12)
{
objcolor = Color.DarkCyan;
}
senão se (itemindex == 13)
{
objcolor = Color.SteelBlue;
}
senão se (itemindex == 14)
{
objcolor = Cor.Tomato;
}
outro
{
objcolor = Color.SlateGray;
}
retornar corobj;
}
}