7 Stimmen

Wie ist die Option "BarSpacing" in Mathematica wirklich implementiert?

Ich versuche, eine DateListBarChart Funktion, die datierte Daten annimmt und ein Balkendiagramm mit denselben Platzierungen ausgibt wie DateListPlot . Es ist wichtig, dass sie die Daten in der gleichen horizontalen Position darstellen, wenn sie die gleichen Daten erhalten, so dass sie mit Show . Ich finde es schwierig, die Einstellungen für BarSpacing rechts, damit sich der horizontale Bereich des Diagramms nicht ändert und die Balken im Wesentlichen an der gleichen Stelle bleiben.

Es ist mir nicht gelungen, die korrekte Skalierung abzuleiten, so dass BarSpacing->{0.2,0.3} führt dazu, dass 20 % der für diese Stabgruppe verfügbaren Länge der x-Achse für die Abstände zwischen den Stäben dieser Gruppe und 30 % für die Abstände zwischen den Stabgruppen verwendet werden. Aus technischen Gründen mache ich dies, indem ich Dinge an RectangleChart . Laut der Dokumentation, BarSpacing wird als absolute Einheit in RectangleChart . Natürlich müssen die absoluten Größen der Lücken kleiner sein, wenn es mehr Serien gibt, und die Balken müssen schmaler sein.

Einige Beispiele:

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}

Ergebnisse in:

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

Beachten Sie, dass die Daten nicht den gleichen Abstand entlang der x-Achse haben wie im vorherigen Beispiel.

Noch unübersichtlicher wird es, wenn Sie versuchen, mehrere Serien in einem Diagramm darzustellen (wie in diesem Beispiel, um es zu illustrieren).

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

Ich habe lange versucht, die richtige Formel zu finden, damit die BarSpacing Einstellungen für die benutzerdefinierte Funktion (hier nicht zu sehen) führen zu den richtigen Abständen und Balkenbreiten, so dass sich der horizontale Plotbereich nicht ändert, wenn die BarSpacing tut.

Was übersehe ich?

EDIT: Als Antwort auf belisarius, ist dies ein Beispiel dafür, wo ich hin will. Es funktioniert, irgendwie (die Balken sind nicht ganz in Ausrichtung mit der Linie, aber das ist wahrscheinlich die Daten, die ich verwende), aber die Fälle mit gestapelten Balken nicht mit den Balken zu plotten, wo sie sein sollten, wie jede Art von Balkendiagramm auf seine eigene, wo es mehrere Serien. (Ich bin ziemlich stolz auf den Algorithmus zur Platzierung der Datumsbeschriftung: die Verantwortlichen bei der Arbeit wollen diesen Look nicht aufgeben).

enter image description here

Und hier ist eine, die einfach nicht funktioniert. Die Daten sollten den horizontalen Bereich ausfüllen. (Die unterschiedlich breiten Balken sind beabsichtigt - es handelt sich um eine Kombination aus jährlichen und vierteljährlichen Daten).

enter image description here

EDIT 2

Ich erinnere mich, warum ich nicht Filling in einem DateListPlot um die Balken wie in Mike Honeychurchs Paket zu zeichnen - wenn Sie etwas anderes als sehr dünne Balken haben, endet es damit, dass die Oberkante an der falschen Stelle ist.

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

enter image description here

9voto

Heike Punkte 23774

Vielleicht mit dem ChartElementFunction anstelle der Option BarSpacing hilft. Zum Beispiel barplot im Code würde ein Balkendiagramm zeichnen, bei dem jeder Balken einen Rand von gapl auf der linken Seite und gapr auf der rechten Seite, wo gapl y gapr sind Bruchteile der Gesamtbreite des Balkens

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}] &)]

Verwendung:

So stellen Sie das ursprüngliche Balkendiagramm ohne Lücken dar

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

rectangle chart with no gaps

Dadurch würde ein Balkendiagramm mit einem Rand von 0,2 auf beiden Seiten gezeichnet, was zu einem Balkendiagramm mit Lücken von 0,4 mal der Gesamtbreite der Balken führt. Beachten Sie, dass die Positionen der Balken mit denen der ersten Abbildung übereinstimmen.

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

barchart with gaps

Sie können mehrere Serien aufzeichnen, indem Sie Folgendes tun

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

two series in one plot

4voto

Mr.Wizard Punkte 23929

Sie können Ihre Beschwerde einreichen über FillingStyle durch die Verwendung von 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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X