用Seaborn绘图

时间:2015-11-04 14:43:44

标签: python pandas matplotlib seaborn

我只是想知道如何在 Seaborn 中绘制这种图表和数据:

data.csv:

1,2,3
2007,05,06
2007,05,06
2007,05,08
2007,05,08
2007,05,12
2007,05,15
2007,05,16
...

我想绘制的条形图:

enter image description here

如果有人知道如何用我的数据用 Seaborn 绘制这种条形图,我将不胜感激。

2 个答案:

答案 0 :(得分:2)

根据您提供的数据,无法创建绘图,因此我制作了一个小样本来测试它。这有点长,因为你需要操纵数据。主要思想是要了解堆积条形图是附加的常规条形图。

import pandas as pd
import io
import matplotlib.pyplot as plt
import seaborn as sns

# sample data - 3rd column ignored
data = """
year,month,count
2007,05,06
2007,05,06
2007,06,08
2007,06,08
2008,05,12
2008,05,15
2008,06,16
    """
# read data
df = pd.read_csv(io.StringIO(data), delimiter=',')

groups = df.groupby(['year','month'])
plot_data = groups.count() # obtain count of year and month multi-index

# additive barplot (May and June)
sns.barplot(x = plot_data.reset_index(level=1).index.unique(), y = plot_data.sum(axis=0, level=1)['count'], data=df , color = "red", ci=None)
# single bottom plot (in this case May only or "05")
bottom_plot = sns.barplot(x = plot_data.reset_index(level=1).index.unique(), y = plot_data.reorder_levels(['month','year']).loc[5]['count'], color = "#0000A3")

bottom_plot.set_ylabel("Count")
bottom_plot.set_xlabel("Year")

plt.show()

enter image description here

这个过程可以增加到包括所有12个月,但我不知道单个代码会在不操纵数据的情况下做到这一点。

答案 1 :(得分:0)

使用pandas,你可以简单地制作一个stacked barplot

df.plot.bar(stacked=True)

因此,您必须先加载或重新整形数据,将月份作为列,将年份作为索引:

import numpy as np
import pandas as pd
import io
import matplotlib.pyplot as plt
import seaborn as sns
# sample data - 3rd column ignored
data = """
1,2,3
2007,05,06
2007,05,06
2007,06,08
2007,06,08
2007,05,06
2007,05,06
2007,06,08
2007,06,08
2007,05,06
2007,05,06
2007,06,08
2007,06,08
2008,03,12
2008,09,15
2008,02,16
2008,04,12
2008,05,15
2008,06,16
2008,03,12
2008,08,15
2008,02,16
2008,09,12
2008,05,15
2008,06,16
    """
# read data
df = pd.read_csv(io.StringIO(data), delimiter=',',names= ['year','count','ignore'],header=0,index_col='year')
nyears = len(np.unique(df.index.values))
df['month']=np.tile(np.arange(1,13),nyears)
#df.drop('ignore',1)
df.pivot(columns='month',values='count').plot.bar(stacked=True)
plt.show()