Я пытаюсь сделать сгруппированный график в 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)
Мои вопросы:
-
Как я могу управлять пространством между группами баров? Прямо сейчас расстояние огромно и выглядит глупо. Обратите внимание: я не хочу, чтобы шины были более широкими - я хочу, чтобы они имели одинаковую ширину, но были ближе друг к другу.
-
Как я могу получить метки, которые будут центрироваться ниже групп баров? Я попытался придумать некоторые арифметические вычисления, чтобы поместить xlabels в нужное место (см. Код выше), но он все еще немного отключен... он немного напоминает запись библиотеки графиков, а не ее использование. Как это можно зафиксировать? (Есть ли оболочка или встроенная утилита для matplotlib, где это поведение по умолчанию?)
РЕДАКТИРОВАТЬ: Ответ на @mlgill: спасибо за ваш ответ. Ваш код, безусловно, намного более изящный, но по-прежнему имеет такую же проблему, а именно, что ширина баров и расстояние между группами не контролируются отдельно. Ваш график выглядит корректно, но бары слишком широки - это выглядит как граф Excel, и я хотел сделать панель более тонкой.
Ширина и маржа теперь связаны, поэтому, если я попробую:
margin = 0.60
width = (1.-2.*margin)/num_items
Это делает панель более тонкой, но приносит группе далеко друг от друга, поэтому сюжет снова выглядит не так.
Как создать функцию группового графика, которая принимает два параметра: ширину каждого бара и расстояние между группами баров, и делает это правильно, как ваш код, т.е. с помощью меток по оси х, расположенных по центру группы?
Я думаю, что, поскольку пользователю приходится вычислять конкретные значения макета низкого уровня, такие как маржа и ширина, мы по-прежнему в основном пишем библиотеку построений:)