6

2 つのカテゴリ変数と 1 つの数値を使用して、データの一連の棒グラフを作成しています。私が持っているのは以下ですが、私がやりたいのは、のようにカテゴリ変数の1つによってファセットすること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)

ここに画像の説明を入力

2つの質問:

  1. AxesSubplot オブジェクトを使用してバー プロット (ここに示すように線をプロット) を実行できますかggplot?
  2. この試みのようなチャートを生成するループでは、それぞれのデータをサブセット化します。このタイプのファセットを行う「適切な」方法だとは想像できませんか?
4

3 に答える 3

4

2 番目の例: 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 に答える