-
El gráfico circular de C# es en realidad algo muy simple. Lo publiqué porque quiero implementar una función que ningún control en la red puede lograr.
Después de buscar en Internet durante casi un día, me sentí mareado, pero el resultado fue realmente decepcionante. En un ataque de ira, dibujé uno yo mismo, que solo me llevó tres horas.
Lleve ayuda a los amigos que la necesiten y evite desvíos. El conocimiento reside en compartir y todos pueden progresar juntos. Bien, no más tonterías. El código es el siguiente.
Puede usarlo directamente para el entorno C#.Net 2005 y el sistema operativo XP. Si necesita conectarse a la base de datos para una visualización dinámica, solo necesita cambiar el DataTable pasado.
No hay comentarios arriba. Pensé que era muy simple, así que lo ignoré. Creo que debería ser muy simple si lo lees con atención.
Primero cree un archivo aspx y publique el siguiente código. Tenga en cuenta que la parte roja se puede cambiar a su propio nombre de archivo.
usando Sistema;
usando System.Collections;
usando System.ComponentModel;
usando System.Data;
usando System.Drawing;
usando System.Web;
utilizando System.Web.UI;
usando System.Web.UI.WebControls;
usando System.Web.UI.HtmlControls;
usando System.Drawing.Drawing2D;
usando System.Drawing.Imaging;
usando System.IO;
clase parcial pública Test_Chart: System.Web.UI.Page
{
Page_Load vacío protegido (remitente del objeto, EventArgs e)
{
//Pon el código de usuario aquí para inicializar la página
Flujo de MemoryStream = nuevo MemoryStream();
MemoryStream columnarStream = nuevo MemoryStream();
Gráfico de mapa de bits = nulo;
Tabla de datos dt = nueva Tabla de datos();
dt.Columns.Add("Ven", tipo de(System.String));
dt.Columns.Add("BadQty", tipo de(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("Montaña Jinggang, Hunan",102);
dt.Rows.Add("Hainan Nanhai",74);
graph = GetPieGraph("Estadísticas de tasa de fallas de Compex de cada grupo",600,500,100,30,dt);
graph.Save(flujo, ImageFormat.Jpeg);
// Salida de imagen
Respuesta.Clear();
Response.ContentType = "imagen/jpeg";
Respuesta.BinaryWrite(stream.ToArray());
}
Mapa de bits protegido GetPieGraph (título de cadena, ancho int, alto int, int izquierda, int superior, DataTable gdt)
{
Mapa de bits objbitmap = nuevo mapa de bits (ancho, alto);
Objetos gráficos;
objgraphics = Graphics.FromImage(objbitmap);
objgraphics.Clear(Color.Blanco);
StringFormat drawformat = new System.Drawing.StringFormat(StringFormatFlags.DirectionVertical);
StringFormat drawformat1 = nuevo System.Drawing.StringFormat(StringFormatFlags.DisplayFormatControl);
objgraphics.DrawString(título, nueva fuente("宋体", 16),Brushes.Black, 150, 5, drawformat1);
PointF symbolleg = new PointF(izquierda, altura superior-45);
PointF descleg = nuevo PointF(izquierda + 20, altura - arriba - 45);
//Dibujar un borde
objgraphics.DrawRectangle(Pens.Black, 0, 0, ancho-1, alto-1);
//Pequeño marco dentro de la imagen.
int h = gdt.Rows.Count / 4;
si (gdt.Rows.Count % 4 > 0)
{
h = h + 1;
}
objgraphics.DrawRectangle(Pens.Black, left-10, height-top-50,gdt.Rows.Count*70+10,20*h);
//Muestra qué color representa qué
para (int i = 0; i < gdt.Rows.Count; i++)
{
si (i >= 4 && (i+1)%4==1)
{
símbololeg.Y += 20;
descleg.Y += 20;
símbololeg.X = izquierda;
descleg.X = izquierda + 20;
}
objgraphics.FillRectangle(new SolidBrush(getcolor(i)), símbololeg.X, símbololeg.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;
flotador sgltotalangle = 0;
float sgltotalvalues = 0;
para (int i = 0; i < gdt.Rows.Count; i++)
{
sgltotalvalues += float.Parse(gdt.Rows[i][1].ToString().Trim());
}
para (int i = 0; i < gdt.Rows.Count; i++)
{
sglcurrentangle = float.Parse(gdt.Rows[i][1].ToString().Trim()) / sgltotalvalues * 360;
objgraphics.FillPie(nuevo SolidBrush(getcolor(i)), izquierda+50, arriba+30, 300, 300, sgltotalangle, sglcurrentangle);
objgraphics.DrawPie(Pens.Black, izquierda + 50, arriba + 30,300, 300, sgltotalangle, sglcurrentangle);
//radio r
doble r = 300/2;
//Posición del centro del círculo:
doble cX = izquierda + 50 + r;
doble cY = arriba + 30 + r;
//Las coordenadas del punto en el círculo:
doble dX = r * Math.Cos((360 - sgltotalangle - sglcurrentangle / 2) * 3,14 / 180);
doble dY = r * Math.Sin((360 - sgltotalangle - sglcurrentangle / 2) * 3,14 / 180);
//Posición en el círculo:
doble dcX = cX + dX;
doble dcY = cY - dY;
//radio r
doble r1 = 350/2;
//Posición del centro del círculo:
doble cX1 = izquierda + 50 + r;
doble cY1 = arriba + 30 + r;
//Las coordenadas del punto en el círculo:
doble dX1 = r1 * Math.Cos((360 - sgltotalangle - sglcurrentangle / 2) * 3,14 / 180);
doble dY1 = r1 * Math.Sin((360 - sgltotalangle - sglcurrentangle / 2) * 3,14 / 180);
//Posición en el círculo:
doble dcX1 = cX1 + dX1;
doble dcY1 = cY1 - dY1;
objgraphics.DrawLine(Pens.Black,Convert.ToInt32(dcX), Convert.ToInt32(dcY),Convert.ToInt32(dcX1), Convert.ToInt32(dcY1));
si (dX1 >= 0 && dY1 >= 0)
{
objgraphics.DrawString(gdt.Rows[i][0].ToString().Trim(), nueva fuente("宋体", 10), Brushes.Black, Convert.ToInt32(dcX1), Convert.ToInt32(dcY1 - 5 ));
}
si (dX1 <= 0 && dY1 >= 0)
{
objgraphics.DrawString(gdt.Rows[i][0].ToString().Trim(), nueva fuente("宋体", 10), Brushes.Black, Convert.ToInt32(dcX1 - 25), Convert.ToInt32(dcY1 - 15));
}
si (dX1 <= 0 && dY1 <= 0)
{
objgraphics.DrawString(gdt.Rows[i][0].ToString().Trim(), nueva fuente("宋体", 10), Brushes.Black, Convert.ToInt32(dcX1 - 30), Convert.ToInt32(dcY1 ));
}
si (dX1 >= 0 && dY1 <= 0)
{
objgraphics.DrawString(gdt.Rows[i][0].ToString().Trim(), nueva fuente("宋体", 10), Brushes.Black, Convert.ToInt32(dcX1), Convert.ToInt32(dcY1)) ;
}
//GetLet(izquierda + 50+150, arriba + 30+150,300,sgltotalangle, sglcurrentangle,arrvalues[i].ToString());
sgltotalangle += sglcurrentangle;
}
devolver mapa de objetos;
}
vacío protegido GetLet (int startX, int startY, doble diámetro, doble ángulo total, doble ángulo actual, tramo de cadena)
{
doble x = 0;
doble y = 0;
doble r = diámetro/2;
x = r * Math.Cos((360 - totalAngle - currentAngle / 2) * 3.14 / 180);
y = r * Math.Sin((360 - ángulo total - ángulo actual / 2) * 3,14 / 180);
}
Color protegido getcolor (int itemindex)
{
Color del objeto;
si (itemindex >= 14)
{
índice de artículo = índice de artículo % 14;
}
si (itemindex == 0)
{
objcolor = Color.DarkMagenta;
}
de lo contrario si (itemindex == 1)
{
objcolor = Color.MediumAquamarine;
}
de lo contrario si (itemindex == 2)
{
objcolor = Color.DeepSkyBlue;
}
de lo contrario si (itemindex == 3)
{
objcolor = Color.RojoOscuro;
}
de lo contrario si (itemindex == 4)
{
objcolor = Color.Rosa;
}
de lo contrario si (itemindex == 5)
{
objcolor = Color.Salmón;
}
de lo contrario si (itemindex == 6)
{
objcolor = Color.Caqui;
}
de lo contrario si (itemindex == 7)
{
objcolor = Color.Granate;
}
de lo contrario si (itemindex == 8)
{
objcolor = Color.LawnGreen;
}
de lo contrario si (itemindex == 9)
{
objcolor = Color.LightGoldenrodYellow;
}
de lo contrario si (itemindex == 10)
{
objcolor = Color.Mocasín;
}
de lo contrario si (itemindex == 11)
{
objcolor = Color.AmarilloVerde;
}
de lo contrario si (itemindex == 12)
{
objcolor = Color.DarkCyan;
}
de lo contrario si (itemindex == 13)
{
objcolor = Color.AceroAzul;
}
de lo contrario si (itemindex == 14)
{
objcolor = Color.Tomate;
}
demás
{
objcolor = Color.SlateGray;
}
devolver color de objeto;
}
}