2013-05-23 41 views
16

Tôi đang hiển thị Biểu đồ cho người dùng có một khu vực biểu đồ có biểu đồ dạng đường. Về điều này, tôi nhận được, ví dụ, một dòng. Dòng này có khoảng 200 giá trị. Tất cả các giá trị đó đều có mô tả (ví dụ: "01.01.2013", "05.02.2013" v.v.).Biểu đồ: Hiển thị mô tả giá trị hơn trên Trục X

Khi biểu đồ được hiển thị, tôi chỉ có thể thấy hai mô tả, ngay cả khi sẽ có không gian để mô tả nhiều hơn nữa. Dòng được hiển thị chính xác, nhưng chỉ có hai điểm được mô tả.

Tôi xoay Văn bản theo chiều dọc để có nhiều không gian hơn, nhưng điều này không hữu ích. Nếu tôi hiển thị ít giá trị hơn (5 hoặc 10), mô tả sẽ hiển thị chính xác.

Đây là cách nó thực sự trông giống như (mô tả thực sự là Chuỗi, không phải Ngày).

The Graph with a lot of values but only two descriptions at the X axis

Cảm ơn sự giúp đỡ của bạn!

EDIT: Mã của tôi:

chart.ChartAreas(0).AxisY.Maximum = 6 
chart.ChartAreas(0).AxisY.Minimum = 1 
chart.ChartAreas(0).AxisX.LabelStyle.Angle = -90 
chart.Series.Clear() 
chart.ChartAreas(0).AxisY.StripLines.Clear() 
Dim myStripLine1 as new StripLine() 
myStripLine1.IntervalOffset = 4 
chart.ChartAreas(0).AxisY.StripLines.add(myStripLine1) 

'now adding all series 
chart.Series.Add("Chemie") 'just to take the example in the image above 
chart.Series(chart.Series.Count - 1).ChartType = DataVisualization.Charting.SeriesChartType.Line 
chart.Series(chart.Series.Count - 1).BorderWidth = 4 

'now adding quite much values (on every date, every Serie has a value) 
chart.Series(chart.Series.Count - 1).Points.AddXY("01.03.2011", 4.9) 

Trên mỗi ngày, một điểm mới được nhập cho tất cả các series, nhưng chỉ những điểm mà họ có giá trị quan trọng có được tô đậm. Những giá trị này được tính toán bằng toán học.

Một ví dụ để giải thích điều này: Tôi có hai chuỗi, một có hai giá trị (6 và 4) ở điểm "01.01.2013""03.01.2013". Loạt khác có 3 giá trị (4,6,5,5) trên "01.01.2013", "02.01.2013""03.01.2013". Khi tôi chỉ hiển thị chúng, chuỗi đầu tiên sẽ kết thúc vào ngày thứ hai, ngay cả khi có giá trị cho ngày thứ ba. Tôi đã giải quyết điều này bằng cách điền vào một giá trị giả ở chuỗi đầu tiên với ngày "02.01.2013" mà chỉ là mức trung bình tại thời điểm này (= 5). Điểm này không được đánh dấu bằng dấu đầu dòng. Đây là cách tôi vẽ đồ thị của mình.

EDIT2:

Sau Skippy's câu trả lời và bình luận, thử nghiệm mới của tôi. Biến MainForm.grades là một Dictionary(Of Integer,Dictionary(Of String, String)) trong đó có khoảng 150 lớp

Dim subjects As New Dictionary(Of Integer, ArrayList) 
    Dim allgrades As New ArrayList 
    For Each grade In MainForm.grades 
     Dim cD As New Dictionary(Of String, String) 
     cD.Add("SUBJECTID", grade.Value("SUBJECTID")) 
     cD.Add("GRADE", grade.Value("GRADE")) 
     cD.Add("DATE", grade.Value("DATE")) 
     allgrades.Add(cD) 
    Next 

    cht_main.ChartAreas(0).AxisX.IntervalType = DateTimeIntervalType.Days 
    cht_main.ChartAreas(0).AxisX.LabelStyle.Angle = -90 
    Dim gradesDateSorter = New gradesDateSorter() 
    allgrades.Sort(gradesDateSorter) 
    For Each grade In allgrades 
     If Not subjects.ContainsKey(Integer.Parse(grade("SUBJECTID"))) Then 
      subjects.Add(Integer.Parse(grade("SUBJECTID")), New ArrayList) 
     End If 
     Dim gradeDict As New Dictionary(Of String, String) 
     gradeDict.Add("DATE", grade("DATE")) 
     gradeDict.Add("GRADE", grade("GRADE")) 
     subjects(Integer.Parse(grade("SUBJECTID"))).Add(gradeDict) 
    Next 
    For Each subject In subjects 
     'adding serie 
     cht_main.Series.Add(MainForm.subjects(subject.Key)("NAME")) 
     cht_main.Series(cht_main.Series.Count - 1).ChartType = DataVisualization.Charting.SeriesChartType.Line 
     cht_main.Series(cht_main.Series.Count - 1).BorderWidth = 4 
     'cht_main.Series(cht_main.Series.Count - 1).IsXValueIndexed = True 
     For Each grade In subject.Value 
      cht_main.Series(cht_main.Series.Count - 1).Points.AddXY(Date.Parse(grade("DATE")), Double.Parse(grade("GRADE"))) 
     Next 
    Next 

Trên hàng cuối cùng 5th tôi nhận xét IsXValueIndexed=True vì khi tôi kích hoạt nó, biểu đồ được tạo ra với một lỗi chữ thập đỏ lớn.


SOLUTION

Thiết lập Interval trên X-Axis hiện các trick!

chart.ChartAreas(0).AxisX.Interval = 1 

Solution bởi Skippy

+0

Bạn đã bao giờ xem xét bên thứ 3 vẽ các thành phần, chẳng hạn như [ZedGraph] (http: // sourcefor ge.net/projects/zedgraph/)? Nhiều khả năng như vậy ít hãy cẩn thận đã được bảo hiểm ở đó. Cho nó một shot! – Neolisk

+1

@yvytty, tôi đã chỉnh sửa câu trả lời của mình bằng mã của mình. –

+0

@Neolisk, tôi đã không thử bởi vì tôi thực sự chỉ sử dụng VB cơ bản và tôi đã cố gắng không sử dụng thư viện, nhưng nếu họ không thừa cân, tôi sẽ cung cấp cho nó một cái nhìn sớm;) –

Trả lời

19

Có, tôi đồng ý với Michael. Tôi chỉ có thể thêm vào phần giải thích tại thời điểm này.

Bằng cách đặt khoảng thời gian của bạn:

myStripLine1.IntervalOffset = 4 

Bạn đang đảm bảo rằng giá trị trục X của bạn sẽ được vẽ mà thôi, ở tần số của 4 "generic trục x" giá trị:

Thiết này để Vale tới 1 sẽ cung cấp một giá trị cho mọi giá trị x-trục, đó là tăng lên như một số nguyên (trong trường hợp này ngày)

chart.ChartAreas(0).AxisX.Interval = 1 

Và để khai báo các giá trị x-trục gõ:

DateTimeIntervalType.Days 

'Declaration 
    Public Sub Add(_ 
    labelsStep As Double, _ 
    intervalType As DateTimeIntervalType, _ 
    format As String _ 
) 
End Sub 

chart.ChartAreas(0).AxisX.IntervalType = DateTimeIntervalType.Days 

'which as shown in Michael's answer is parsed to string. 

Dim format as String = "MM.dd.yyyy" 
Dim actualDate as Date = Date.ParseExact(yourDate, format) 

Như đã đề cập trong bài bình luận của Michael. Bằng cách đặt

mySeries.XValueIndexed = True 

Mọi giá trị trục X được lập chỉ mục sẽ được vẽ.

Như được giải thích trong báo sau, với liên kết được cung cấp.

Mỗi điểm dữ liệu trong một chuỗi có giá trị X và Y xác định vị trí của nó trong khu vực vẽ đồ thị. Với một số biểu đồ, giá trị X của các điểm không quan trọng và không cần phải cung cấp. Trong trường hợp này, các vị trí điểm trong khu vực vẽ đồ thị được xác định chỉ bằng chỉ số điểm của chúng (nghĩa là vị trí của chúng trong bộ sưu tập Điểm) và các giá trị Y của chúng.

Khi giá trị X được "lập chỉ mục", chỉ mục điểm dữ liệu, không phải là giá trị X của điểm, được sử dụng để xác định vị trí của các điểm dọc theo trục phân loại (X). Ví dụ trong Hình 1 bên dưới, hai biểu đồ được hiển thị hiển thị cùng một dữ liệu. Tuy nhiên, biểu đồ đầu tiên sử dụng các giá trị X không được lập chỉ mục, do đó giá trị X của các điểm đó xác định vị trí của chúng dọc theo trục x. Biểu đồ thứ hai được lập chỉ mục, do đó các chỉ số điểm của nó được sử dụng để xác định vị trí của chúng dọc theo trục x. Trong trường hợp này, các giá trị X chỉ được sử dụng cho các nhãn trục và không có gì hơn.

http://support2.dundas.com/onlinedocumentation/winchart2005/Data_IndexedXValues.html

tôi nguồn thông tin ban đầu của tôi về khoảng cách và offsets khoảng tại trang web sau:

http://support2.dundas.com/Default.aspx?article=705

Ở đây nó thảo luận về kiểu dữ liệu và giải quyết vấn đề của bạn những giá trị nổi bật.

Trên mỗi ngày, một điểm mới được nhập cho tất cả các series, nhưng chỉ những điểm mà họ có giá trị quan trọng có được tô đậm

Ví dụ, giả sử bạn muốn tạo một stripline lại xảy ra để làm nổi bật những ngày cuối tuần . Bạn đặt khoảng thời gian là 7 và loại của nó thành Ngày. Vì điểm đầu tiên là Chủ nhật, bạn đặt IntervalOffset thành 6 (nghĩa là ngày thứ 6 trong tuần) và loại thành Ngày. Biểu đồ kết quả không hiển thị StripLine đầu tiên.

Đây là giải thích cho việc thiết lập khoảng thời gian.

Một nguyên tắc nhỏ để làm theo khi sử dụng các thuộc tính Interval và IntervalOffset của bảng xếp hạng là IntervalOffset nên một cường độ khoảng thấp hơn Interval (tức. Interval Days/IntervalOffset Giờ, Interval năm/IntervalOffset tháng , v.v.)

Tôi đã thêm các nguồn:

  1. Để tham khảo của
  2. Để hiển thị tôi có, cũng có thể, thực hiện nghiên cứu của tôi sau khi việc xác vấn đề này, như đã nêu trong ý kiến ​​của tôi ở trên.

Florian, bạn có thể hiển thị mã cho nhãn, thuộc tính vv của trục x không? - yvytty hôm qua

Bạn đã bao giờ xem xét các thành phần âm mưu bên thứ 3, chẳng hạn như ZedGraph? Nhiều khả năng như vậy ít hãy cẩn thận đã được bảo hiểm ở đó. Cho nó một shot! - Neolisk hôm qua

Để đối phó với ZedGraph Tôi khuyên:

Và: Sau khi xem mã của bạn

Hi tôi có thể làm rõ, bạn muốn âm mưu giá trị hàng ngày? Tôi nghĩ rằng tôi có giải pháp của bạn, chỉ cần làm rõ,bạn có tất cả các công cụ trong vb.net

@yvytty, nope, ngày không phải hàng ngày, có thể cũng không có giá trị một thời gian dài thời gian và tôi không muốn một khoảng thời gian lớn trong biểu đồ của tôi mà không có dữ liệu. Trên thực tế, tôi cũng có thể viết một số văn bản mẫu tại các giá trị trục X, các ngày chỉ gây nhầm lẫn. Vấn đề chính là biểu đồ VB bằng cách nào đó tính toán một biên độ rất lớn trên các mô tả đó tại trục X

Nó không cho thấy bạn đã định dạng chuỗi ngày tháng. Cũng cần phải tính đến, rằng bạn không sử dụng định dạng ngày của Hoa Kỳ (tôi ở Úc, vì vậy chúng tôi có cùng định dạng với bạn). Loại ngày mặc định là cho en-US.

Vui lòng tham khảo DateTime.ParseExact Phương pháp

http://msdn.microsoft.com/en-us/library/system.datetime.parseexact.aspx

tôi đã lấy đoạn từ MSDN.

Dim dateString, format As String 
Dim result As Date 
Dim provider As CultureInfo = CultureInfo.InvariantCulture 

Parse date and time with custom specifier. 
dateString = "Sun 15 Jun 2008 8:30 AM -06:00" 
format = "ddd dd MMM yyyy h:mm tt zzz"   
result = Date.ParseExact(dateString, format, provider) 

Xem link: http://msdn.microsoft.com/en-us/library/w2sa9yss.aspx

Các DateTime.ToString phương pháp (IFormatProvider) trả về chuỗi đại diện của một ngày và thời gian giá trị sử dụng từ ngày ngắn và mô hình thời gian dài của một nền văn hóa cụ thể. Ví dụ sau sử dụng phương thức DateTime.ToString (IFormatProvider) để hiển thị ngày và thời gian bằng cách sử dụng ngày tháng ngắn và mẫu thời gian dài cho văn hóa fr-FR.

Dim date1 As Date = #3/1/2008 7:00AM# 
Console.WriteLine(date1.ToString(System.Globalization.CultureInfo.CreateSpecificCulture("fr-FR"))) 
' Displays 01/03/2008 07:00:00 

Xin xem liên kết này: http://msdn.microsoft.com/en-us/library/system.datetime.aspx

Vì vậy, nó nên đi, một cái gì đó như thế này:

'note 
Imports System.Globalization 

Dim format as String = "dd.MM.yyyy" 
Dim actualDate as Date = Date.ParseExact(yourDate, format, provider) 

chart.ChartAreas(0).AxisX.LabelStyle.Format ="dd.MM.yyyy" 

cht_main.ChartAreas(0).AxisX.IntervalType = DateTimeIntervalType.Days 

cht_main.ChartAreas(0).AxisX.Interval = 1 

CŨNG:

Double.Parse(grade("GRADE") 
'grade is not of type double 
+0

Tôi đã thử nó theo cách của bạn, nhưng tôi chỉ quản lý để có được 6 nhãn X trục. http://img62.imageshack.us/img62/1121/chart2x.png –

+1

Tôi đã cập nhật câu trả lời của mình;) –

+0

Không phải là:/ –

4

Tôi nghĩ bạn nên chuyển đổi các đại diện chuỗi ngày đến một đối tượng datetime thực tế trước khi thêm nó vào bảng xếp hạng. tôi đã không kiểm tra nó, nhưng một cái gì đó như thế này: (nơi yourDate là chuỗi bạn sử dụng để vượt qua bảng xếp hạng)

Dim format as String = "MM.dd.yyyy" 
Dim actualDate as Date = Date.ParseExact(yourDate, format) 
chart.Series(chart.Series.Count - 1).Points.AddXY(actualDate, 4.9) 

Biểu đồ có thể quản lý đối tượng datetime thay vì chuỗi và nó có mã đặc biệt mà những giao dịch với ngày. Nếu bạn làm điều này bạn bạn có thể điều chỉnh nó như thế nào sẽ được hiển thị bằng cách định dạng:

chart.ChartAreas(0).AxisX.LabelStyle.Format ="MM.dd.yyyy" 
chart.ChartAreas(0).AxisX.Interval = 1 
chart.ChartAreas(0).AxisX.IntervalType = DateTimeIntervalType.Days 

Nếu bạn muốn chỉ hiển thị mỗi ngày khác thay đổi khoảng cách đến 2

+0

Tôi cũng đã thử điều đó, nhưng vấn đề là trong trường hợp này ngày tháng ngẫu nhiên sẽ được hiển thị trên trục X - không chỉ ngày tháng mà có một điểm trong biểu đồ ở trên. Như tôi đã đề cập, ngày tháng khó hiểu - giả sử có "Giá trị 1" và "Giá trị 2" thay vì ngày tháng. –

+0

Tôi nghĩ rằng nếu bạn chỉ cần đặt chuỗi thành 'mySeries.XValueIndexed = True', nó sẽ nhận được những gì bạn muốn – Michael

Các vấn đề liên quan