我在尝试解决为什么我的图表控件无法正常工作时遇到问题。我之前从未与Pie Charts合作过,而且我无法获得填充的基本饼图。最终,我正在尝试使用百分比(如果可能)创建爆炸饼图
到目前为止我的代码是:
chrtRegisterAvailability.Series.Clear()
chrtRegisterAvailability.Series.Add("Series1")
chrtRegisterAvailability.Series("Series1").Points.AddXY("Online", 60)
chrtRegisterAvailability.Series("Series1").Points.AddXY("Offline", 40)
chrtRegisterAvailability.Series("Series1").ChartType = SeriesChartType.Pie
chrtRegisterAvailability.Series("Series1")("PieLabelStyle") = "Outside"
chrtRegisterAvailability.ChartAreas("ChartArea1").Area3DStyle.Enable3D = True
chrtRegisterAvailability.Series.Add("Series1")
毫无疑问,我错过了一些东西,因为我尝试在网上找到各种例子,但没有运气。任何帮助表示感谢。
答案 0 :(得分:1)
试试这段代码。可能是没有清除图表是问题。
With Me.chrtRegisterAvailability
.Legends.Clear()
.Series.Clear()
.ChartAreas.Clear()
End With
Dim areas1 As ChartArea = Me.chrtRegisterAvailability.ChartAreas.Add("Areas1")
With areas1
End With
Dim series1 As Series = Me.chrtRegisterAvailability.Series.Add("Series1")
With series1
.ChartArea = areas1.Name
.ChartType = SeriesChartType.Pie
.Points.AddXY("Online", 60)
.Points.AddXY("Offline", 40)
End With
Dim legends1 As Legend = Me.chrtRegisterAvailability.Legends.Add("Legends1")
答案 1 :(得分:0)
将Panel2放在表单上 位置9,75 大小659,577 复制和粘贴代码
导入Microsoft.VisualBasic.PowerPacks
Public Class Form1
Public Colors() As Color
Public Data(), Degree(359) As Double
Public EArc(), CArc(), Parts(), PieSize(), Radius, SArc() As Integer
Public Labels(0, 3) As Label
Public Center, ECenter() As Point
Public sc As New ShapeContainer
Private GLine(360) As LineShape
Public LabelNamess(), TitleName As String
Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
Radius = 246
Center.X = 300
Center.Y = 300
Dim count As Integer = -1
For x = 270 To 359
count = count + 1
Degree(count) = 0.01745 * (x)
Next
For x = 0 To 269
count = count + 1
Degree(count) = 0.01745 * (x)
Next
Dim c(12) As Color
c(0) = Color.Black
c(1) = Color.Red
c(2) = Color.DarkSlateBlue
c(3) = Color.Yellow
c(4) = Color.Green
c(5) = Color.Blue
c(6) = Color.Purple
c(7) = Color.Navy
c(8) = Color.Brown
c(9) = Color.Cyan
c(10) = Color.DarkGreen
c(11) = Color.DarkRed
c(12) = Color.HotPink
Colors = c
Dim p(12) As Double
p(0) = 5696
p(1) = 5495.99
p(2) = 6016.99
p(3) = 5168.99
p(4) = 5421.99
p(5) = 6030.99
p(6) = 4810.99
p(7) = 5199.99
p(8) = 4716.0
p(9) = 4095.95
p(10) = 3299.99
p(11) = 4562.19
p(12) = 5267.38
Data = p
Dim s(12) As String
s(0) = "January 2014"
s(1) = "Febuary 2014"
s(2) = "March 2014"
s(3) = "April 2014"
s(4) = "May 2014"
s(5) = "June 2014"
s(6) = "July 2014"
s(7) = "August 2014"
s(8) = "September 2014"
s(9) = "October 2014"
s(10) = "November 2014"
s(11) = "December 2014"
s(12) = "January 2015"
LabelNamess = s
TitleName = "Monthly Graph for 2014"
CreatePieGraph()
End Sub
Public Sub CreatePieGraph()
Title.Text = TitleName
Title.Left = 639 - Int(Title.Width / 2)
DrawGraph()
PieLabels()
End Sub
Public Sub PieLabels()
ReDim Labels(Data.Length - 1, 3)
Dim per As Double
For x = 0 To LabelNamess.GetLength(0) - 1
Dim l As New Label
l.Left = 20
l.Top = 50 + (40 * x)
l.Width = 240
l.Height = 24
l.Font = New System.Drawing.Font("Microsoft Sans Serif", 14.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
l.Text = LabelNamess(x)
l.Name = "L0" & x
Labels(x, 0) = l
Panel2.Controls.Add(l)
Dim l1 As New Label
l1.Left = 275
l1.Top = 50 + (40 * x)
l1.Width = 20
l1.Height = 24
l1.BackColor = Colors(x)
l1.Font = New System.Drawing.Font("Microsoft Sans Serif", 14.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
l1.Text = ""
l1.Name = "L1" & x
Labels(x, 1) = l1
Panel2.Controls.Add(l1)
Dim l2 As New Label
l2.Left = 315
l2.Top = 50 + (40 * x)
l2.Width = 90
l2.Height = 24
l2.Font = New System.Drawing.Font("Microsoft Sans Serif", 14.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
per = (PieSize(x) / 360) * 100
l2.Text = Format(per, "###.###") & "%"
l2.Name = "L2" & x
Labels(x, 2) = l2
Panel2.Controls.Add(l2)
Dim l3 As New Label
l3.Left = 425
l3.Top = 50 + (40 * x)
l3.Width = 140
l3.Height = 24
l3.Font = New System.Drawing.Font("Microsoft Sans Serif", 14.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
per = (PieSize(x) / 252) * 100
l3.Text = Format(Data(x), "$#,###,###,###.00")
l3.Name = "L3" & x
Labels(x, 3) = l3
Panel2.Controls.Add(l3)
Next
End Sub
Private Function PiceSize(RawData() As Double) As Array
Dim Dsum As Double
Dim ps As Integer = RawData.Length - 1
Dim count, z, size0(ps), size1(ps), size2(ps), size3(ps), max As Integer
Dim sizes(2) As Array
For x = 0 To RawData.GetLength(0) - 1
Dsum = Dsum + RawData(x)
Next
For x = 0 To ps
size0(x) = Int((RawData(x) / Dsum) * 360)
If ((RawData(x) / Dsum) * 360) - size0(x) > 0.49999 Then size0(x) = size0(x) + 1
count = count + size0(x)
Next
z = -1
If count < 360 Then
For x = count + 1 To 360
z = z + 1
If z > sizes.GetLength(0) Then z = 0
size0(z) = size0(z) + 1
count = count + 1
Next
End If
If count > 360 Then
For x = count - 1 To 360 Step -1
z = z + 1
If z > sizes.GetLength(0) Then z = 0
size0(z) = size0(z) - 1
count = count - 1
Next
End If
count = 0
For x = 0 To ps
If x = 0 Then size1(x) = 0
If x = 0 Then size2(x) = size0(x)
If x = 0 Then size3(x) = Int(size0(x) / 2)
If x <> 0 Then size1(x) = count
If x <> 0 Then size2(x) = count + size0(x)
If x <> 0 Then size3(x) = size1(x) + Int(size0(x) / 2)
If x = ps Then size2(x) = size2(x)
count = count + size0(x)
Next
SArc = size1
EArc = size2
CArc = size3
PiceSize = size0
End Function
Private Sub DrawGraph()
Dim x1, y1, z, p As Integer
Dim sizes(Data.GetLength(0) - 1) As Integer
Dim ps As Integer = Data.GetLength(0) - 1
Dim Ecenter1(ps) As Point
PieSize = PiceSize(Data)
z = 1
sc.Height = 600
sc.Width = 600
sc.Top = 74
sc.Left = 608
For num As Double = 0 To 359
x1 = Convert.ToInt32(Radius * Math.Cos(Degree(num)) + Center.X)
y1 = Convert.ToInt32(Radius * Math.Sin(Degree(num)) + Center.Y)
If num = CArc(p) Then
Ecenter1(p).X = Convert.ToInt32(50 * Math.Cos(Degree(num)) + Center.X)
Ecenter1(p).Y = Convert.ToInt32(50 * Math.Sin(Degree(num)) + Center.Y)
End If
Dim Line As New LineShape
Line.X1 = Center.X
Line.Y1 = Center.Y
Line.X2 = x1
Line.Y2 = y1
Line.BorderColor = Colors(p)
Line.BorderWidth = 5
Line.Visible = True
Line.Name = "line" & Chr(p + 65) & z
If z = PieSize(p) Then
p = p + 1
z = 0
End If
z = z + 1
GLine(num) = Line
AddHandler Line.MouseHover, AddressOf CicrleHover
AddHandler Line.MouseLeave, AddressOf CicrleLeave
AddHandler Line.Click, AddressOf ExplodePice
AddHandler Line.DoubleClick, AddressOf ChangeColor
sc.Shapes.Add(Line)
Next
ECenter = Ecenter1
Panel1.Controls.Add(sc)
End Sub
Protected Sub CicrleHover(sender As Object, e As System.EventArgs)
Dim o As LineShape = sender
Dim n As String = o.Name
Dim s As Integer = Asc(Mid(n, 5, 1)) - 65
For x = 0 To 3
If x <> 1 Then
Labels(s, x).BackColor = Color.Black
Labels(s, x).ForeColor = Color.White
End If
Next
End Sub
Protected Sub CicrleLeave(sender As Object, e As System.EventArgs)
Dim o As LineShape = sender
Dim n As String = o.Name
Dim s As Integer = Asc(Mid(n, 5, 1)) - 65
For x = 0 To 3
If x <> 1 Then
Labels(s, x).BackColor = Color.White
Labels(s, x).ForeColor = Color.Black
End If
Next
End Sub
Protected Sub ExplodePice(Sender As Object, e As System.EventArgs)
Dim o As LineShape = Sender
Dim n As String = o.Name
Dim s As Integer = Asc(Mid(n, 5, 1)) - 65
Dim x1, y1 As Integer
Dim cpoint As Point
If o.X1 = Center.X Then cpoint = ECenter(s) Else cpoint = Center
For x = SArc(s) To EArc(s) - 1
x1 = Convert.ToInt32(Radius * Math.Cos(Degree(x)) + cpoint.X)
y1 = Convert.ToInt32(Radius * Math.Sin(Degree(x)) + cpoint.Y)
GLine(x).X2 = x1
GLine(x).Y2 = y1
GLine(x).X1 = cpoint.X
GLine(x).Y1 = cpoint.Y
Next
End Sub
Protected Sub ChangeColor(Sender As Object, e As System.EventArgs)
Dim o As LineShape = Sender
Dim n As String = o.Name
Dim s As Integer = Asc(Mid(n, 5, 1)) - 65
ColorDialog1.ShowDialog()
For x = SArc(s) To EArc(s) - 1
GLine(x).BorderColor = ColorDialog1.Color
Next
Labels(s, 1).BackColor = ColorDialog1.Color
End Sub
结束班