Próbuję utworzyć zgrupowany wykres słupkowy w matplotlib, zgodnie z przykładem w galerii. Używam następujące:ustawianie odstępów między zgrupowanymi wykresami słupkowymi w 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)
moje pytania są następujące:
Jak mogę kontrolować przestrzeń pomiędzy grupami barów? W tej chwili rozstaw jest ogromny i wygląda głupio. Zwróć uwagę, że nie chcę, aby paski były szersze - chcę, żeby miały tę samą szerokość, ale były bliżej siebie.
W jaki sposób mogę ustawić etykiety poniżej grup słupków? Próbowałem wymyślić kilka obliczeń arytmetycznych, aby umieścić we właściwym miejscu xlabele (patrz kod powyżej), ale wciąż jest trochę poza ... to trochę tak, jakby pisać bibliotekę kreślącą, zamiast jej używać. Jak to może zostać naprawione? (Czy istnieje wrapper lub wbudowane narzędzie do matplotlib, gdy jest to zachowanie domyślne?)
EDIT: Odpowiedz @mlgill: dziękuję za odpowiedź. Twój kod jest z pewnością znacznie bardziej elegancki, ale wciąż ma ten sam problem, a mianowicie, że szerokość pasków i odstępy między grupami nie są kontrolowane osobno. Twój wykres wygląda poprawnie, ale paski są o wiele za szerokie - wygląda jak wykres Excela - i chciałem, aby pasek był cieńszy.
Szerokość i marża są teraz połączone, więc jeśli próbuję:
margin = 0.60
width = (1.-2.*margin)/num_items
To sprawia, że bar chudszy, ale przynosi grupę daleko od siebie, więc fabuła znowu nie wygląda dobrze.
Jak utworzyć zgrupowaną funkcję wykresu słupkowego, która pobiera dwa parametry: szerokość każdego słupka i odstępy między grupami prętów i kreślenie go poprawnie, tak jak zrobił to twój kod, tj. Z etykietami osi X wyśrodkowanymi poniżej grupy?
myślę, że ponieważ użytkownik musi obliczyć konkretne ilości układu niskiego poziomu, jak i szerokości marginesu, nadal jesteśmy w zasadzie pisanie kreślenia biblioteki :)
Zwróć też uwagę na znacznie zmniejszoną liczbę poleceń, gdy moje komentarze zostaną usunięte. Chociaż myślę, że funkcja kreślenia prętów Matplotlib mogłaby w jakiś sposób ulec niewielkiej poprawie, z pewnością nie jest to już pisanie biblioteki kreślącej. :) –
dziękuję za komentarz, odpowiedziałem w edytorze na mój główny wpis. – user248237dfsf
Z tego, co napisałeś powyżej, brzmi to tak, jakbyś chciał, aby szerokość całego wykresu była mniejsza (można to ustawić w linii, która tworzy figurę) lub aby marginesy same w sobie były większe, co pozwoli zachować proporcje takie same. Można również dostosować obliczenia szerokości i xdata, tak aby między każdym z nich był margines. Osiągnięcie tego wymaga jedynie podstawowej algebry. Poza tymi trzema pomysłami nie mam pojęcia, o co prosisz. –