我正在制作一系列带有两个分类变量和一个数字的条形图。我所拥有的是下面的内容,但我喜欢做的是使用facet_wrap
中的ggplot
之一的分类变量进行分析。我有一个有点工作的例子,但我得到错误的绘图类型(行而不是条形),我在循环中对数据进行子集化 - 这不是最好的方法。
## first try--plain vanilla
import pandas as pd
import numpy as np
N = 100
## generate toy data
ind = np.random.choice(['a','b','c'], N)
cty = np.random.choice(['x','y','z'], N)
jobs = np.random.randint(low=1,high=250,size=N)
## prep data frame
df_city = pd.DataFrame({'industry':ind,'city':cty,'jobs':jobs})
df_city_grouped = df_city.groupby(['city','industry']).jobs.sum().unstack()
df_city_grouped.plot(kind='bar',stacked=True,figsize=(9, 6))
这就是这样的:
city industry jobs
0 z b 180
1 z c 121
2 x a 33
3 z a 121
4 z c 236
然而,我希望看到的是这样的:
## R code
library(plyr)
df_city<-read.csv('/home/aksel/Downloads/mockcity.csv',sep='\t')
## summarize
df_city_grouped <- ddply(df_city, .(city,industry), summarise, jobstot = sum(jobs))
## plot
ggplot(df_city_grouped, aes(x=industry, y=jobstot)) +
geom_bar(stat='identity') +
facet_wrap(~city)
我与matplotlib最接近的是这样的:
cols =df_city.city.value_counts().shape[0]
fig, axes = plt.subplots(1, cols, figsize=(8, 8))
for x, city in enumerate(df_city.city.value_counts().index.values):
data = df_city[(df_city['city'] == city)]
data = data.groupby(['industry']).jobs.sum()
axes[x].plot(data)
所以有两个问题:
ggplot
示例中facet_wrap示例中的某些内容; 答案 0 :(得分:4)
此处的第二个示例:http://pandas-docs.github.io/pandas-docs-travis/visualization.html#bar-plots
无论如何,你可以随手做,就像你自己一样。
编辑: 顺便说一句,你总是可以在python中使用rpy2,所以你可以做与R中相同的事情。
另外,请看一下:http://pandas.pydata.org/pandas-docs/stable/rplot.html 我不确定,但它应该有助于在许多面板上创建绘图,但可能需要进一步阅读。
答案 1 :(得分:1)
@tcasell建议在循环中调用bar
。这是一个有效的例子。
## second try--facet by county
N = 100
industry = ['a','b','c']
city = ['x','y','z']
ind = np.random.choice(industry, N)
cty = np.random.choice(city, N)
jobs = np.random.randint(low=1,high=250,size=N)
df_city =pd.DataFrame({'industry':ind,'city':cty,'jobs':jobs})
## how many panels do we need?
cols =df_city.city.value_counts().shape[0]
fig, axes = plt.subplots(1, cols, figsize=(8, 8))
for x, city in enumerate(df_city.city.value_counts().index.values):
data = df_city[(df_city['city'] == city)]
data = data.groupby(['industry']).jobs.sum()
print (data)
print type(data.index)
left= [k[0] for k in enumerate(data)]
right= [k[1] for k in enumerate(data)]
axes[x].bar(left,right,label="%s" % (city))
axes[x].set_xticks(left, minor=False)
axes[x].set_xticklabels(data.index.values)
axes[x].legend(loc='best')
axes[x].grid(True)
fig.suptitle('Employment By Industry By City', fontsize=20)
答案 2 :(得分:0)
Seaborn library建立在Matplotlib之上,可以被认为是它的超集,它具有针对面图的灵活而强大的绘图选项-他们甚至使用与R类似的术语。向下滚动{{3} },以获取多个示例。