2011-09-03 23 views
7

Tôi đang cố gắng triển khai hàm DateListBarChart lấy dữ liệu ngày và xuất ra biểu đồ thanh có cùng vị trí như DateListPlot. Điều cốt yếu là chúng vẽ dữ liệu ở cùng vị trí ngang nếu được cung cấp cùng một dữ liệu, vì vậy chúng có thể được kết hợp bằng cách sử dụng Show. Tôi thấy khó khăn để có được các thiết lập cho BarSpacing phải để phạm vi ngang của cốt truyện không thay đổi, và các quán bar ở trong cơ bản cùng một vị trí.Tùy chọn BarSpacing thực sự được triển khai như thế nào trong Mathematica?

Tôi không thể suy ra tỷ lệ chính xác để BarSpacing->{0.2,0.3} kết quả trong 20% ​​độ dài trục x có sẵn cho nhóm thanh đó được lấy với khoảng cách giữa các thanh trong nhóm đó và 30% làm khoảng cách giữa các nhóm thanh. Vì lý do kỹ thuật, tôi đang thực hiện việc này bằng cách chuyển những thứ đến RectangleChart. Theo tài liệu, BarSpacing được coi là đơn vị tuyệt đối trong RectangleChart. Rõ ràng là kích thước tuyệt đối của khoảng trống cần phải nhỏ hơn nếu có nhiều chuỗi hơn và các thanh cần phải hẹp hơn.

Một số ví dụ:

arList = FoldList[0.9 #1 + #2 &, 0.01, RandomReal[NormalDistribution[0, 1], 24]] 

{0.01, 0.334557, 2.02709, 1.1878, 1.9009, 3.08604, 2.36652, 3.04111, 
3.32364, 3.22662, 3.12626, 2.59118, 1.69334, 1.21069, 0.23171, 
0.689415, -0.852649, -0.124624, 0.58604, -0.481886, 0.221074, 
-0.300329, 2.36137, 0.427789, -1.47747} 

dists = RandomChoice[{3, 4}, Length[arList]] 
{4, 4, 4, 3, 4, 3, 4, 3, 4, 4, 3, 4, 4, 3, 4, 4, 4, 4, 3, 4, 3, 3, 3, 3, 3} 

Kết quả trong:

RectangleChart[Transpose[{dists - 0 - 0/2, arList}], 
PlotRange -> {{0, 100}, {-2, 4}}, ChartStyle -> EdgeForm[None], 
Frame -> True, GridLines -> Automatic, BarSpacing -> {0, 0}] 

enter image description here

RectangleChart[Transpose[{dists - 0.7 - 0.5/2, arList}], 
PlotRange -> {{0, 100}, {-2, 4}}, ChartStyle -> EdgeForm[None], 
Frame -> True, GridLines -> Automatic, BarSpacing -> {0.7, 0.5}] 

enter image description here

Chú ý cách dữ liệu một không kéo dài cùng khoảng cách dọc theo trục x như ví dụ trước.

Nó trở nên rối rắm hơn khi cố gắng lập biểu đồ nhiều chuỗi (giống như trong ví dụ này, để minh hoạ).

RectangleChart[ 
Transpose[{{dists - i/2 - j/2, arList}, {dists - i/2 - j/2, 
    arList}}, {2, 3, 1}], PlotRange -> {{0, 180}, {-2, 4}}, 
ChartStyle -> EdgeForm[None], Frame -> True, Ticks -> None, 
    GridLines -> Automatic, BarSpacing -> {i, j}] 

enter image description here

Tôi đã futzing cho các lứa tuổi cố gắng để tìm ra công thức đúng để BarSpacing cài đặt cho các chức năng tùy chỉnh (không nhìn thấy ở đây) gây ra các spacings chính xác và độ rộng thanh để âm mưu ngang phạm vi không thay đổi khi BarSpacing thực hiện.

Tôi đang thiếu gì?

EDIT: Để đáp lại belisarius, đây là ví dụ về nơi tôi đang hướng đến. Nó hoạt động, loại (các thanh không hoàn toàn phù hợp với dòng, nhưng đây có lẽ là những ngày tôi đang sử dụng) nhưng các trường hợp với các thanh xếp chồng không thể vẽ được với các thanh mà chúng cần, cũng như bất kỳ loại biểu đồ thanh của riêng nó khi có nhiều chuỗi. (Tôi rất tự hào về các thuật toán sắp xếp nhãn date: các cường quốc mà được tại nơi làm việc không muốn từ bỏ cái nhìn đó.)

enter image description here

Và đây là một trong đó chỉ không hoạt động. Dữ liệu phải điền vào phạm vi ngang. (Các thanh chiều rộng khác nhau được cân nhắc - đó là kết hợp dữ liệu hàng năm và hàng quý.)

enter image description here

EDIT 2

Tôi nhớ lý do tại sao tôi không sử dụng Filling trong một DateListPlot để vẽ các thanh như trong gói Mike Honeychurch của - nếu bạn có bất cứ điều gì khác hơn là thanh rất gầy, họ cuối cùng có cạnh trên ở sai chỗ.

DateListPlot[{dateARList}, 
PlotStyle -> {AbsolutePointSize[6], Yellow}, Filling -> {1 -> 0}, 
FillingStyle -> {1 -> {{AbsoluteThickness[12], Darker[Red, 0.25]}}}, 
PlotRange -> All] 

enter image description here

+0

Tôi nghĩ rằng 'chức năng VolumePlot' Mike Honeychurch của thể chứng minh hữu ích. Bạn có thể tìm thấy mã ở đây: http://library.wolfram.com/infocenter/MathSource/7526/ Theo như tôi có thể nói, mã này có vẻ là một phiên bản sơ bộ của các ô trực quan tài chính mới trong v8. Hữu ích? – telefunkenvf14

+0

_Perhaps_ một ví dụ (ảnh) về những gì bạn đang cố gắng làm với 'DateListPlot' (mặc dù không thành công) có thể giúp tôi hiểu được vấn đề ... –

+0

@belisarius - xem điều này có giúp ích gì không. Kiểu biểu đồ tổ chức rất cụ thể. – Verbeia

Trả lời

9

Có thể sử dụng các tùy chọn ChartElementFunction thay vì BarSpacing giúp. Ví dụ barplot trong mã sẽ vẽ một biểu đồ thanh như vậy mà mỗi thanh có lề gapl ở bên trái và gapr trên bên phải, nơi gaplgapr là phân số của tổng chiều rộng của thanh

scale[{{xmin_, xmax_}, {ymin_, ymax_}}, {gapl_, gapr_}] := 
{{xmin (1 - gapl) + xmax gapl, ymin}, {xmax (1 - gapr) + xmin gapr, ymax}} 

barplot[dists_, arList_, {gapl_, gapr_}, opts___] := 
RectangleChart[Transpose[{dists, arList }], opts, 
    Frame -> True, 
    GridLines -> Automatic, BarSpacing -> 0, 
    ChartElementFunction -> (Rectangle @@ scale[#, {gapl, gapr}] &)] 

Cách sử dụng:

Để vẽ biểu đồ thanh gốc không có khoảng trống

barplot[dists, arList, {0, 0}] 

rectangle chart with no gaps

Điều này sẽ vẽ biểu đồ thanh có lề 0,2 trên cả hai mặt dẫn đến biểu đồ thanh có khoảng trống 0,4 lần tổng chiều rộng của các thanh. Lưu ý rằng vị trí của các thanh khớp với các vị trí trong hình đầu tiên.

barplot[dists, arList, {0.2, 0.2}] 

barchart with gaps

Bạn có thể vẽ nhiều loạt bằng cách làm một cái gì đó giống như

Show[barplot[dists, arList 0.9, {0, 0.5}], 
barplot[dists, arList 0.8, {0.5, 0}, ChartStyle -> LightGreen]] 

two series in one plot

+1

+1 Thật tuyệt vời, Heike - Tôi chưa bao giờ nghĩ đến 'ChartElementFunction'. – Verbeia

+0

Tôi vừa xác nhận rằng nó hoạt động. Nó chỉ ra rằng nếu bạn mở rộng chiều rộng của hình chữ nhật cho số lượng chuỗi (mà tôi đã làm anyway) bạn thậm chí không cần phải sử dụng 'Hiển thị'. Tôi chọn giá trị của tùy chọn 'BarSpacing' và sau đó sử dụng' ChartElementFunction -> (Rectangle @@ barscale [#, {gapfactorwithin/(2 xscaling), gapfactorwithin/(2 xscaling)}] &) ', trong khi thiết lập' BarSpacing 'quay lại 0 trong' RectangleChart' thực tế. Cảm ơn Heike một lần nữa, điều đó đã giúp tôi rất nhiều. Đây là một ví dụ khác khi tôi nên ngừng đập đầu vào bàn phím và hỏi internet sớm hơn :) – Verbeia

+0

+1 cho 'ChartElementFunction' - không bao giờ sử dụng nó trước đây. –

4

Bạn có thể làm giảm khiếu nại của bạn về FillingStyle bằng cách sử dụng CapForm["Butt"].

list = {0.01, -0.81, 0.12, 0.81, 1.79, 1.1, 0.41, 1., 1.33, 1.08, 
    2.16, 1.13, 1.92, 1.64, 1.31, 1.94, 1.71, 0.91, 2.32, 0.95, 1.29, 
    1.28, 2.97, 4.45, 5.11} 

DateListPlot[list, {2000, 8}, 
PlotStyle -> {AbsolutePointSize[6], Yellow}, Filling -> {1 -> 0}, 
FillingStyle -> {1 -> {{CapForm["Butt"], AbsoluteThickness[14], 
     Darker[Red, 0.25]}}}, PlotRange -> {0, 6}, ImageSize -> 400] 

enter image description here

+0

đó là một giải pháp tuyệt vời! Nó không thích hợp cho các thanh xếp chồng lên nhau và nhiều chuỗi, trừ khi tôi thực hiện một số thao tác của các tập dữ liệu được tích lũy. Nhưng nó có thể là một lựa chọn hữu ích cho các biểu đồ thanh và vạch đơn cho vấn đề này: http://stackoverflow.com/questions/7396898/why-do-barchart-graphics-exported-from-mathematica-have-pixelated-text -is-there – Verbeia

+0

@ Verbeia, tôi biết nó không phải là một giải pháp hoàn chỉnh, nhưng tôi nghĩ nó sẽ hữu ích, và nó rất đơn giản. –

+0

, và việc sử dụng 'CapForm' trong tùy chọn Kiểu không được biết rõ. +1 đó là tôi. – Verbeia

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