python - 为每个面板制作一个包含不同类别的多面板条形图

时间:2017-06-09 21:06:44

标签: python r matplotlib ggplot2

我想在python中制作多面板条形图,每个面板都有不同的类别。下面,我将展示一个如何用R中的ggplot2来做这个的例子。我正在寻找可以做等效的python中的任何方法。到目前为止,我一直在python-ggplot和seaborn以及matplotlib的基础上努力做到这一点到目前为止没有运气。

您可以在我的相关帖子中看到此前的尝试: using facet_wrap with categorical variables that differ between facet panes

在这篇文章中,我现在要问是否有任何方法可以制作我在python中寻找的那种情节(而不仅仅是尝试使用特定的方法)。

好的:R中的例子:

animal = c('sheep', 'sheep', 'cow', 'cow', 'horse', 'horse', 'horse')
attribute = c('standard', 'woolly', 'brown', 'spotted', 'red', 'brown', 'grey')
population = c(12, 2, 7, 3, 2, 4, 5)
animalCounts = data.frame(animal,attribute,population)

ggplot(aes(x = attribute, weight = population), data = animalCounts) + geom_bar() + 
facet_wrap(~animal, scales = "free") + scale_y_continuous ( limits= c(0,12))

barchart that I would like to make in python

我可以在python中创建一个类似的数据框

animal = pd.Series(['sheep', 'sheep', 'cow', 'cow', 'horse', 'horse', 'horse'], dtype = 'category')
attribute = pd.Series(['standard', 'woolly', 'brown', 'spotted', 'red', 'brown', 'grey'], dtype = 'category')
population = pd.Series([12, 2, 7, 3, 2, 4, 5])
animalCounts = pd.DataFrame({'animal' : animal, 'attribute' : attribute, 'population': population})

任何帮助在python中获得可比较的数字都将受到高度赞赏。如果我不必使用rpy2,那就是虚构的奖励积分。

1 个答案:

答案 0 :(得分:1)

由于问题已在last question中提出,python ggplot无法使用facet_wrap

因此,使用标准的pandas / matplotlib技术是一种选择。

import matplotlib.pyplot as plt
import pandas as pd

animal = pd.Series(['sheep', 'sheep', 'cow', 'cow', 'horse', 'horse', 'horse'], dtype = 'category')
attribute = pd.Series(['standard', 'woolly', 'brown', 'spotted', 'red', 'brown', 'grey'], dtype = 'category')
population = pd.Series([12, 2, 7, 3, 2, 4, 5])
df = pd.DataFrame({'animal' : animal, 'attribute' : attribute, 'population': population})

fig, axes = plt.subplots(ncols=3)
for i, (name, group) in enumerate(df.groupby("animal")):
    axes[i].set_title(name)
    group.plot(kind="bar", x = "attribute", y="population", ax=axes[i], legend=False)
    axes[i].set_ylabel("count")
    axes[i].set_xlabel("")

axes[1].set_xlabel("attribute")    
plt.tight_layout()
plt.show()

enter image description here