我正在製作一系列具有兩個分類變量和一個數字的數據柱狀圖。我所擁有的是以下內容,但是我想要做的是由facet_wrap
的ggplot
中的一個分類變量構成。我有一個有點工作的例子,但是我得到了錯誤的繪圖類型(線條而不是線條),並且我在循環中對數據進行了子集化 - 這不是最好的方法。pandas/matplotlib:分麪條圖
## 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)
所以兩個問題:
- 我可以做吧地塊(他們的情節線,如下所示)使用AxesSubplot對象,並以沿着從
ggplot
示例的facet_wrap示例的行結束的東西; - 在循環生成圖表,如這種嘗試,我分別在每個數據子集。我無法想象這是做這種刻面的「正確」方式?
你爲什麼不在你的循環中使用'bar'? – tacaswell
@tcaswell,很好的建議。繪製條形圖的訣竅是什麼?這兩個參數似乎都需要作爲數字。先轉換分類變量?有沒有更規範的方法? – ako
查看http://matplotlib.org/api/axes_api.html#matplotlib.axes.Axes.bar – tacaswell