2010-09-17 37 views
14

Tôi hiện đang sử dụng biểu đồ trong .NET bằng cách sử dụng System.Windows.Forms.DataVisualization.Charting.Chart. Vì vậy, đến nay nó có vẻ rất mạnh mẽ, và hoạt động tuyệt vời. Tuy nhiên, có một vấn đề lớn về cách nó được tính toán tự động khoảng thời gian. Tôi sử dụng rất nhiều giá trị double và trong các thư viện như ZedGraph, nó xử lý điều này một cách hoàn hảo. Nó chọn min/max/interval tốt. Tuy nhiên, trong biểu đồ MS, nó có thể chọn 206.3334539832 ở mức tối thiểu và khoảng thời gian có độ chính xác thập phân tương tự. Rõ ràng điều này trông khá xấu xí.Độ chính xác Auto-Interval trong Biểu đồ MS

Vì vậy, tôi đã thử chỉ định định dạng trục {0.00} và nó hoạt động tốt khi tải biểu đồ. Trừ khi bạn phóng to, bạn cần độ chính xác cao hơn, có thể ở 4 chữ số thập phân thay vì 2. Có vẻ như tôi bị kẹt với 9 chữ số thập phân mọi lúc, hoặc một số cố định cố định có thể bị vỡ khi ai đó yêu cầu độ chính xác cao hơn. Tôi muốn nó nhận độ chính xác dựa trên mức độ phóng hiện đang được áp dụng. Các thư viện như ZedGraph và Dundas (mà tôi tin rằng MS thậm chí còn sử dụng!) Có xu hướng chọn các giá trị tốt thay đổi khi bạn phóng to và thu nhỏ.

Có cách nào để các khoảng thời gian thay đổi độ chính xác khi khung thu phóng thay đổi không? Nó có lẽ là một số tài sản đơn giản tôi đã đặt sai, nhưng thật khó để nói với hàng triệu tài sản điều này có (đặc biệt là khi có khoảng 14 nơi đại diện cho khái niệm về khoảng thời gian).

+2

AFAIK, các điều khiển biểu đồ dựa trên điều khiển Dundas. Microsoft đã mua lại các thành phần trực quan hóa dữ liệu của Dundas một thời gian trước đây. Thông tin thêm [tại đây] (http://blogs.msdn.com/b/bimusings/archive/2007/06/04/microsoft-acquires-dundas-s-data-visualization-components-sql-2008-news-download- ctp3.aspx) – CGK

+0

Không có hình trong bản chỉnh sửa của bạn? – noelicus

+0

@noelicus Xin lỗi, công việc mới kể từ đó và những hình ảnh đó đã bị gỡ xuống tại một thời điểm nào đó (rõ ràng đây là trước khi SO cho phép tải lên hình ảnh). Tôi đã xóa bản chỉnh sửa ngay bây giờ. Tôi sẽ xem xét xem tôi có thể tìm thấy bản sao của những hình ảnh đó hay không và cập nhật câu hỏi này nếu tôi có thể. – drharris

Trả lời

5

Tôi gặp sự cố tương tự khi phóng to. Tôi đã thêm mã để định dạng nhãn trục và gọi nó từ trình xử lý Paint. Các đối tượng Axis View có một thuộc tính IsZoomed và có các hàm để lấy các giới hạn trục hiện tại (GetViewMinimum/Maximum). Tôi đặt Axis LabelStyle.Format thành "N" cho tất cả các trường hợp trừ khi phạm vi Max-Min = nhỏ hơn 1. Sau đó, tôi đặt định dạng thành "F #" trong đó # được tính dựa trên phạm vi trục.

# = Convert.ToInt32(Math.Abs(Math.Log10(range) - .5)) + 1; 
+0

Cảm ơn bạn rất nhiều vì đã chỉ ra GetViewMinimum/Maximum! Đây có lẽ là những chức năng tôi đang tìm kiếm. Tôi sẽ thử điều này sớm, và nếu nó hoạt động cho trường hợp của tôi, tôi sẽ phục hồi tiền thưởng trước đó của tôi và đưa nó cho bạn. Cũng nhờ mã để có được số thập phân - sau khi một số thử nghiệm trong WolframAlpha nó dường như tạo ra số lượng hoàn hảo của số thập phân. – drharris

+0

Tôi quên báo cáo lại, nhưng cuối cùng tôi đã có thời gian để chi tiêu để thực hiện điều này, và nó hoạt động hoàn hảo. Tôi vẫn nghĩ rằng bản thân điều khiển nên xử lý loại logic này (nếu các dự án mã nguồn mở như ZedGraph có thể làm điều đó, chắc chắn MS/Dundas có thể). Tôi đã phục hồi tiền thưởng ban đầu về câu hỏi này vì điều này giúp tôi tiết kiệm rất nhiều đau đầu từ những khách hàng không hài lòng! Tôi sẽ trao nó ngay khi SO cho phép tôi. – drharris

1

Đã phát xung quanh với điều khiển biểu đồ Tôi không thể tìm thấy giải pháp đơn giản cho vấn đề của bạn. Tuy nhiên, những điều sau đây có thể hữu ích:

Bạn đã tự đặt giá trị tối đa và tối thiểu cho các trục chưa? Nếu bạn làm tròn giá trị lớn nhất và tối thiểu thực tế đến số "tròn" hợp lý gần nhất (5, 10, 0,5, 0,01), điều này sẽ làm cho các khoảng được tính toán thân thiện hơn một chút.

Tôi hiểu đây không phải là giải pháp lý tưởng nhưng bằng cách chọn cẩn thận giá trị tối đa và/hoặc tối thiểu bạn có thể đảm bảo khoảng thời gian là số "đẹp hơn". Nếu phạm vi của các trục của bạn được chia hết cho 2, 5 & 10, nó sẽ dẫn đến khoảng thời gian khá đẹp.

+0

Tôi đã cố gắng tự cài đặt tối thiểu và tối đa, nhưng các biểu đồ này được sử dụng để phân tích và ngay khi bạn phóng to vào vùng tùy chỉnh, nó sẽ mất các số tròn đẹp và quay lại hành vi không mong muốn này. Ngoài ra, việc đặt giá trị tối thiểu thành -10 đôi khi dẫn đến -10.00000023 hoặc tương tự. Vì vậy, bạn đang ở nửa chừng đó; nó sửa chữa hiển thị ban đầu, nhưng với tất cả các phóng to sẽ xảy ra, nó không phải là một giải pháp hoàn chỉnh cho vấn đề. Thật tốt khi nghe tôi không phải là người duy nhất! – drharris

0

Để cung cấp các kết quả với chi phí tối thiểu bạn có thể sử dụng định dạng khoa học mũ

+0

Nếu đây là một ứng dụng trong nhà chỉ được sử dụng bởi những người có đầu óc khoa học, điều đó thật tuyệt vời! Tuy nhiên, chúng tôi có một cơ sở người dùng từ giáo sư đại học đến nông dân. Giảng dạy một số những người này để đọc định dạng số mũ sẽ gần như không thể. Ngoài ra, sử dụng các số khoa học không ngăn được vấn đề của quá nhiều chữ số thập phân (như trong 2.6666684583e-4) – drharris

+0

Chỉ cần sử dụng string.Format ("{0: e2}", 123.456789). Cũng cố gắng để aply trình chuyển đổi tùy chỉnh aply. – gabba

1

Tại sao không sửa đổi chuỗi định dạng số.

Tạo chuỗi định dạng

string formatString = "{0.00"; 

Xác định mức độ phóng, nói zoomLevel = 2;

formatString = formatString.PadRight(5+zoomLevel, '0'); 
formatString += "}"; 

Bây giờ sử dụng định dạng này trên chú giải trục. Sử dụng trình tạo chuỗi hoặc một số cách tốt hơn để sửa đổi chuỗi định dạng.

+0

Vấn đề là "mức thu phóng" có rất ít ý nghĩa. Tỷ lệ không phải lúc nào cũng giống nhau (đôi khi, trục X có thể dao động từ 100-120 và các thời điểm khác từ 0-4000). Ngoài ra, người dùng có thể tự chọn cửa sổ thu phóng, có nghĩa là không có cách nào rõ ràng để xác định số lượng vị trí thập phân cần định dạng. Câu trả lời hay về lý thuyết, nhưng nó không phù hợp với mô hình đối tượng ở đây. – drharris

0

Bạn có thể đính kèm vào tùy chỉnh sự kiện. Từ đó, bạn có thể sửa đổi nhãn trên trục x:

var xAxisLabels = chart1.ChartAreas[0].AxisX.CustomLabels; 
... 
xAxisLabels[0].Text = ... 

đặt phút. và tối đa. giá trị:

chart1.ChartAreas[0].AxisX.Maximum = ...; 

, vv

0

bạn có thể tự động cập nhật max và min dựa trên bộ dữ liệu của bạn.mỗi khi người dùng phóng to, bạn thực hiện FOREACH trên mọi điểm và nhận số liệu thống kê và dựa trên thiết lập đó tối đa và tối thiểu của bạn

+0

Mã? Cách phát hiện khi người dùng phóng to? Làm thế nào để chỉ lấy các điểm trong cửa sổ trong khi zoom đang hoạt động? – drharris

0

Nó giúp để thiết lập IntervalOffset của trục, ở đây một ví dụ:

Private Sub chMap_AxisViewChanged(sender As System.Object, e As System.Windows.Forms.DataVisualization.Charting.ViewEventArgs) Handles chMap.AxisViewChanged 
    'the grid ticks are rounded values 
    e.Axis.IntervalOffset = -e.Axis.ScaleView.ViewMinimum 
End Sub 
Các vấn đề liên quan