6

我正在制作一系列带有两个分类变量和一个数字的数据条形图。我所拥有的是以下内容,但我想做的是通过一个分类变量来分面,就像facet_wrapin一样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)

在此处输入图像描述

所以两个问题:

  1. 我可以使用 AxesSubplot 对象绘制条形图(它们绘制线如图所示),并最终得到与示例中的 facet_wrap 示例类似的东西吗ggplot
  2. 在循环生成图表(如本次尝试)中,我将每个中的数据子集化。我无法想象这是进行这种刻面的“正确”方式?
4

3 回答 3

4

这里的第二个例子:http: //pandas-docs.github.io/pandas-docs-travis/visualization.html#bar-plots

无论如何,您总是可以手动完成,就像您自己做的那样。

编辑:顺便说一句,你总是可以在 python 中使用 rpy2,所以你可以做所有与 R 相同的事情。

另外,看看这个:https ://pandas.pydata.org/pandas-docs/version/0.14.1/rplot.html 我不确定,但它应该有助于在许多面板上创建图,虽然可能需要进一步阅读。

于 2013-10-27T05:24:29.733 回答
2

@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)

在此处输入图像描述

于 2013-10-27T05:13:45.437 回答
1

Seaborn 库是基于 Matplotlib 构建的,可以被视为它的超集,它具有灵活而强大的平面图绘图选项——它们甚至使用与 R 相似的术语。在此页面上向下滚动以查看多个示例。

于 2020-09-17T19:58:34.390 回答