Sto provando a creare un grafico a barre raggruppato in matplotlib, seguendo l'esempio nella galleria. Io uso il seguente:impostazione della spaziatura tra i grafici a barre raggruppati in matplotlib
import matplotlib.pyplot as plt
plt.figure(figsize=(7,7), dpi=300)
xticks = [0.1, 1.1]
groups = [[1.04, 0.96],
[1.69, 4.02]]
group_labels = ["G1", "G2"]
num_items = len(group_labels)
ind = arange(num_items)
width = 0.1
s = plt.subplot(1,1,1)
for num, vals in enumerate(groups):
print "plotting: ", vals
group_len = len(vals)
gene_rects = plt.bar(ind, vals, width,
align="center")
ind = ind + width
num_groups = len(group_labels)
# Make label centered with respect to group of bars
# Is there a less complicated way?
offset = (num_groups/2.) * width
xticks = arange(num_groups) + offset
s.set_xticks(xticks)
print "xticks: ", xticks
plt.xlim([0 - width, max(xticks) + (num_groups * width)])
s.set_xticklabels(group_labels)
Le mie domande sono:
Come posso controllare lo spazio tra i gruppi di barre? In questo momento la spaziatura è enorme e sembra sciocca. Nota che non voglio allargare le barre: voglio che abbiano la stessa larghezza, ma che siano più vicine.
Come posso ottenere che le etichette siano centrate sotto i gruppi di barre? Ho cercato di elaborare alcuni calcoli aritmetici per posizionare gli xlabels nel posto giusto (vedi il codice sopra) ma è ancora leggermente fuori ... sembra un po 'come scrivere una libreria di stampa piuttosto che usarne uno. Come si puo aggiustare? (C'è un involucro o costruito nel programma di utilità per matplotlib in cui questo è il comportamento predefinito?)
EDIT: Rispondi a @mlgill: la ringrazio per la risposta. Il tuo codice è sicuramente molto più elegante ma ha ancora lo stesso problema, ovvero che la larghezza delle barre e la spaziatura tra i gruppi non sono controllate separatamente. Il tuo grafico sembra corretto ma le barre sono troppo larghe - sembra un grafico Excel - e volevo rendere la barra più sottile.
larghezza e il margine sono ora collegati, quindi se provo:
margin = 0.60
width = (1.-2.*margin)/num_items
rende la barra di magro, ma porta il gruppo distanti tra loro, in modo ancora una volta la trama non sembra giusto.
Come posso creare una funzione di grafico a barre raggruppata che impiega due parametri: la larghezza di ogni barra e la spaziatura tra i gruppi di barre e la stampa correttamente come il tuo codice, cioè con le etichette dell'asse x centrate sotto i gruppi?
Penso che da quando l'utente deve calcolare quantità specifiche di layout a basso livello come il margine e la larghezza, stiamo ancora fondamentalmente scrivendo una biblioteca tramando :)
Inoltre, si noti il numero notevolmente ridotto di comandi, una volta che i miei commenti sono stati rimossi. Mentre penso che la funzione di tracciamento delle barre di Matplotlib potrebbe usare miglioramenti minori in qualche modo, non è certamente più come scrivere una libreria di stampa. :) –
grazie per il tuo commento, ti ho risposto in una modifica al mio post principale. – user248237dfsf
Da quanto hai scritto sopra, sembra che tu voglia o meno la larghezza dell'intero grafico (questo può essere impostato nella linea che crea la figura) o vuoi che i margini stessi siano più grandi, il che manterrà la proporzioni uguali. È anche possibile regolare la larghezza e i calcoli xdata in modo che vi sia un margine tra ciascuna barra. Per fare ciò è necessaria solo l'algebra di base. Al di là di queste tre idee, non ho idea di cosa stai chiedendo. –