2011-09-03 10 views
7

Sto tentando di implementare una funzione DateListBarChart che acquisisce dati datati e genera un grafico a barre con gli stessi posizionamenti di DateListPlot. È essenziale che i dati vengano tracciati nella stessa posizione orizzontale se vengono forniti gli stessi dati, in modo che possano essere combinati utilizzando Show. Mi risulta difficile ottenere le impostazioni per BarSpacing in modo che l'intervallo orizzontale del grafico non cambi e le barre rimangano essenzialmente nello stesso punto.In che modo l'opzione BarSpacing è realmente implementata in Mathematica?

sono stato in grado di dedurre la scala corretta in modo che BarSpacing->{0.2,0.3} risultati nel 20% della lunghezza asse x disponibile per il gruppo di barre viene ripreso con spaziatura tra le barre in quel gruppo, e il 30% come spaziatura tra gruppi di barre. Per ragioni tecniche, lo faccio passando a RectangleChart. Secondo la documentazione, BarSpacing viene considerato come unità assolute in RectangleChart. Ovviamente le dimensioni assolute degli spazi devono essere più piccole se ci sono più serie e le barre devono essere più strette.

Alcuni esempi:

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} 

si traduce 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

notare come i dati di un non considerando la stessa distanza lungo l'asse x del precedente esempio.

Diventa ancora più caotico quando si tenta di tracciare più serie (lo stesso in questo esempio, per illustrazione).

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

ho futzing per le età cercando di trovare la formula giusta in modo che BarSpacing impostazioni per la funzione personalizzata (non visto qui) indurre le spaziature corrette e larghezze barra in modo che la trama orizzontale la gamma non cambia come fa BarSpacing.

Cosa mi manca?

EDIT: In risposta a Belisario, questo è un esempio di dove sto andando. Funziona, tipo (le barre non sono perfettamente allineate con la linea, ma probabilmente sono le date che sto usando) ma i casi con barre impilate non riescono a tracciare con le barre dove dovrebbero essere, come ogni tipo di grafico a barre da solo dove esistono più serie. (Sono abbastanza orgoglioso del algoritmo di posizionamento data di etichetta: i poteri che essere sul posto di lavoro non vogliono rinunciare a quello sguardo.)

enter image description here

E qui è uno che proprio non funziona. I dati dovrebbero riempire l'intervallo orizzontale. (Le diverse barre di larghezza sono intenzionali - è una combinazione di dati annuali e trimestrali.)

enter image description here

EDIT 2

mi ricordo perché non ho utilizzare Filling in un DateListPlot per disegnare le barre come nel pacchetto di Mike Honeychurch - se avete qualcosa di diverso da bar molto magro, finiscono per avere il bordo superiore nel posto sbagliato.

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

enter image description here

+0

Penso funzione VolumePlot' di Mike Honeychurch 'può risultare utile. È possibile trovare il codice qui: http://library.wolfram.com/infocenter/MathSource/7526/ Per quanto posso dire, questo codice sembra essere una versione preliminare dei nuovi grafici di visualizzazione finanza in v8. Utile? – telefunkenvf14

+0

_Perhaps_ un esempio (immagine) di cosa si sta provando a fare con 'DateListPlot' (anche se non riuscito) potrebbe aiutarmi a capire il problema ... –

+0

@belisarius - vedere se questo aiuta. Lo stile del grafico organizzativo è molto particolare. – Verbeia

risposta

9

Forse utilizzando l'opzione invece di BarSpacingChartElementFunction aiuta. Ad esempio barplot nel codice sarebbe tracciare un grafico a barre in modo che ciascuna barra ha margini gapl a sinistra e gapr sulla destra dove gapl e gapr sono frazioni della larghezza totale della barra

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

utilizzati:

per tracciare il grafico a barre originale senza lacune

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

rectangle chart with no gaps

Questo grafico traccia un grafico a barre con un margine di 0,2 su entrambi i lati che si traduce in un grafico a barre con intervalli di 0,4 volte la larghezza totale delle barre. Si noti che le posizioni delle barre corrispondono a quelle della prima cifra.

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

barchart with gaps

È possibile tracciare più serie facendo qualcosa di simile

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 E 'fantastico, Heike - Non ho mai pensato a "ChartElementFunction". – Verbeia

+0

Ho appena confermato che funziona. Si scopre che se riduci le larghezze dei rettangoli per il numero di serie (che stavo facendo comunque) non hai nemmeno bisogno di usare 'Mostra'. Prendo il valore dell'opzione 'BarSpacing' e poi utilizzo' ChartElementFunction -> (Rectangle @@ barscale [#, {gapfactorwithin/(2 xscaling), gapfactorwithin/(2 xscaling)}] &) ', mentre si imposta' BarSpacing 'torna a 0 nell'attuale' RectangleChart'. Grazie ancora Heike, questo mi ha aiutato molto. Questo è un altro esempio in cui dovrei smettere di sbattere la testa contro la tastiera e chiedere a Internet prima :) – Verbeia

+0

+1 per 'ChartElementFunction' - non l'ho mai usato prima. –

4

Si può alleviare il vostro reclamo circa FillingStyle utilizzando 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

questa è una soluzione fantastica! Non è adatto per barre impilate e serie multiple, a meno che non esegua una manipolazione dei set di dati per essere cumulativo. Ma potrebbe essere un'opzione utile per la barra singola e il grafico a barre dati questo problema: http://stackoverflow.com/questions/7396898/why-do-barchart-graphics-exported-from-mathematica-have-pixelated-text -è-ci – Verbeia

+0

@Verbeia, so che non è una soluzione completa, ma ho pensato che sarebbe stato utile, ed è molto semplice. –

+0

lo è, e l'uso di 'CapForm' in un'opzione Style non è ben noto. Quel +1 ero io. – Verbeia

Problemi correlati