2011-08-16 5 views
7

Sto creando un'applicazione per vari tipi di disegno grafico/grafico in Mathematica. Alla fine avrà una GUI, ma il primo passo è ottenere il codice giusto e abbastanza semplice da gestire per una GUI. Ho difficoltà a impostare legende per non avere una cornice intorno a loro.È possibile rimuovere il bordo del telaio su una legenda del barchart?

Ecco un esempio minimo (con alcune opzioni su BarChart già personalizzati utilizzando SetOptions

mydata = {4.5644, 5.546, 6.8674, 2.7688, 1.742, 5.3952, 4.3392, 4.5016, \ 
3.7748, 1.838, 2.24, 0.693, 2.818, 4.9, 3.939, 3.459, 3.755, 4.475, \ 
3.857, 3.215, 2.206, 2.206, 2.117, 3.403, 3.277, 3.761, 4.276, 2.559, \ 
3.486, 4.778, 2.281, 2.865, 3.629, 4.916, 4.572, 5.244, 5.395, 2.865, \ 
-0.524, 5.01, 4.401, 4.513, 4.54} 

BarChart[mydata, 
ChartStyle -> {Join[ 
    Table[RGBColor[0.5, 0.5, 0.95], {Length[mydata] - 3}], {Magenta, 
    Magenta, Magenta}]}, PlotRange -> {-2, 8}, 
ChartLegends -> {Join[ 
    Table[None, {Length[mydata] - 3}], {Placed[ 
    Style["Forecasts", FontFamily -> "Arial", FontSize -> 18], 
    Bottom]}]}, BarSpacing -> 0.4, 
LegendAppearance -> Directive[Background -> Red, 
    Frame -> None, ImageSize -> 15]] 

E qui è quello che ottengo:. enter image description here

Per quanto mi sforzassi, non riesco liberare quel confine attorno alla legenda.Per vedere che LegendAppearance non fa nulla - ho provato anche qualche altro approccio a questo:

Sono reticente a codificare poco recta ngles a mano, perché sarà molto difficile entrare nella GUI finale. ChartLabels non funzionerà, perché è già in uso per le etichette delle date nella versione reale del grafico.

Qualcuno ha qualche suggerimento?

risposta

8

Puoi temporaneamente, uccidere a livello globale la cornice impostando:

SetOptions[Legending`GridLegend, Legending`LegendContainer -> Identity] 

Per ripristinare il comportamento predefinito, impostare:

SetOptions[Legending`GridLegend, Legending`LegendContainer -> Automatic] 
+0

+1: scusate, sono a casa malato e sono appena arrivato a controllare che funzionasse. Funziona su v8, ed è il tipo di cosa che posso inserire nel pacchetto come predefinito. Grazie! – Verbeia

+0

Molto, molto interessante: 'legending '*' (dove tale marchio citazione è un backquote) dà un sacco di bit e pezzi irregolari .: AssembleLegendContainer \t ContourLegend \t Leggenda \t LegendImage \t LegendPane \t Legends BubbleScaleLegend \t CurveLegend \t LegendContainer \t LegendItemLayout \t LegendPosition \t LegendSize ColorGradientLegend \t GridLegend \t LegendHeading \t LegendLayout \t LegendReap \t LegendSow – Verbeia

+1

@Verbeia grazie per la conferma che funziona, e spero che sia utile. Perdonami * me * se suonassi impaziente. Non ero. Piuttosto, una soluzione di lavoro di solito ottiene almeno un voto dopo otto ore, quindi ho pensato che forse questa opzione non documentata fosse stata rimossa nella versione 8. (A proposito, penso che si possa incorporare l'apice inviando due backtick per il blocco di codice. prova: ''? Legenda' * '') –

10

Non riesco a trovare alcuna opzione per disattivare la cornice. La documentazione di LegendAppearance è abbastanza ridotta e lo stile delle leggende in genere non ha molte discussioni (vedi [2] e collegamenti all'interno).

La soluzione più semplice che riesco a pensare è quella di modificare manualmente la grafica. I grafici con legende producono oggetti grafici Labeled. Per una singola legenda, l'oggetto Labeled prodotto è simile a Labeled[Graphics[...], Framed[...], pos], quindi tutto ciò che devi fare è rimuovere la parte Framed. Questo potrebbe essere fatto semplicemente rimuovendo tutte le teste Framed utilizzando un ReplaceAll (ad esempio BarChart[...] /. Framed -> Identity), ma forse qualcosa di più mirato sarebbe più sicuro.

mydata = {4.5644, 5.546, 6.8674, 2.7688, 1.742, 5.3952, 4.3392, 
    4.5016, 3.7748, 1.838, 2.24, 0.693, 2.818, 4.9, 3.939, 3.459, 
    3.755, 4.475, 3.857, 3.215, 2.206, 2.206, 2.117, 3.403, 3.277, 
    3.761, 4.276, 2.559, 3.486, 4.778, 2.281, 2.865, 3.629, 4.916, 
    4.572, 5.244, 5.395, 2.865, -0.524, 5.01, 4.401, 4.513, 4.54}; 

bc = BarChart[{Legended[Style[mydata[[;; -4]], Red], "Data"], 
    Legended[Style[mydata[[-3 ;;]], Blue], "Forecasts"]}, 
    PlotRange -> {-2, 8}, BarSpacing -> 0.4, LegendAppearance -> "Row"] 

with frame

bc /. Labeled[g_, Framed[leg_], pos_] :> Labeled[g, leg, pos] 

with frame removed

Quanto sopra potrebbe anche essere prodotto utilizzando Replace[bc, Framed[leg_] :> leg, {1}] o MapAt[Apply[Identity, #] &, bc, 2] o simili costruzioni. Non sarebbe necessario molto per modificare il codice se si dispone di più etichette o tipi diversi di oggetti grafici.

+0

+1 Stavo per suggerire la stessa soluzione, ma la tua è più completa. Il nome "LegendAppearance" suggerisce più di quello che sembra in pratica. –

+0

+1 - grazie Simon, il secondo esempio (usando '/. Labeled [g_, Framed [leg_], pos_]:> Labeled [g, leg, pos]') fa esattamente quello che dovrebbe, anche se la trama stessa ha un 'Frame'. Sarà interessante capire il caso generale e vedere se ciò può essere fatto in una GUI. – Verbeia

+0

@Simon 'InputForm [bc]', possibilmente seguito da '(InputForm [bc /. {Framed [legend_]:> legend}]) [[1]]', aiuta a chiarire perché la tua soluzione funziona. '[[1]]' rimuove il wrapper 'InputForm []'. – DavidC

3

Non versatile come Simon 's metodo dato above, ma comunque forse vale la pena postare.(Ho trovato questo durante la lettura this domanda)

Utilizzando Part, dove bc la definizione di cui di answer Simon:

bc[[2]] = bc[[2, 1]]; bc 

dando

enter image description here