也许我已经习惯了R's
精彩ggplot
- 做面子图时的习惯用法(它需要数字和字符串变量而没有抗议)但ggplot以外的理想方式肯定让我无法获得一段时间了解matplotlib世界。
我通常会在几个方面面对很多条形图,并且最近在matplotlib上发现了一个着名的seaborn图书馆,它有一个简单的分面界面。
条形图通常需要x变量的数字向量(而不是分类字符串向量) - 这里首先是一些模拟数据和基本图:
import pandas as pd
import numpy as np
import seaborn as sns
N = 100
## generate toy data
ind = np.random.choice(['retail','construction','information'], N)
cty = np.random.choice(['cooltown','mountain pines'], N)
age = np.random.choice(['young','old'], N)
jobs = np.random.randint(low=1,high=250,size=N)
## prep data frame
df_city = pd.DataFrame({'industry':ind,'city':cty,'jobs':jobs,'age':age})
df_city_grouped = df_city.groupby(['city','industry','age']).sum()
df_city_grouped.unstack().plot(kind='bar',stacked=True,figsize=(9, 6),title='Jobs by city, industry, age group')
这会产生这个情节。这种数据框图方法可以使用索引在幕后绘制:
现在,进入 seaborn ,它有一个很好的分面界面。 首先,我将多指数展平,因此我改为使用列(我认为这是API所必需的)。
df_city_grouped.reset_index(inplace=True)
df_city_grouped.head()
+----------+--------------+-------+------+
| city | industry | age | jobs |
+----------+--------------+-------+------+
| cooltown | construction | old | 563 |
+----------+--------------+-------+------+
| cooltown | construction | young | 1337 |
+----------+--------------+-------+------+
| cooltown | information | old | 1234 |
+----------+--------------+-------+------+
| cooltown | information | young | 1402 |
+----------+--------------+-------+------+
| cooltown | retail | old | 1035 |
+----------+--------------+-------+------+
调用此方法会向我显示错误TypeError: cannot concatenate 'str' and 'float' objects
。
g = sns.FacetGrid(df_city_grouped, col="industry", row="city", margin_titles=True)
g.map(plt.bar, "age","jobs", color="darkred", lw=0)
但是,我可以破解它并将其中一个分类变量转回一个数字:
mapping = {
'young': 1,
'middle':2,
'old':3}
df_city_grouped['age2']=df_city_grouped.age.map(mapping)
g = sns.FacetGrid(df_city_grouped, col="industry", row="city", margin_titles=True)
g.map(plt.bar, "age2","jobs", color="darkred", lw=0)
产生近似结果(但在x上有小数)。 所以我的问题是 - 在分面示例中处理分类轴的最佳方法是什么? (顺便提一下注意到
f, (ax) = plt.subplots()
sns.barplot(df_city_grouped.industry, df_city_grouped.jobs, ax=ax, ci=None)
适用于分类标签。除了刻薄的成语之外。)
答案 0 :(得分:3)
将sns.factorplot
与kind="bar"
一起使用。有关详细信息,请参阅docs,但以下是您的数据示例:
sns.factorplot("age", "jobs", col="industry", row="city", data=df_city,
margin_titles=True, size=3, aspect=.8, palette=["darkred"])