Python 与Seaborn密谋
我只是想知道如何在Seaborn中绘制此类图表和数据: data.csv:Python 与Seaborn密谋,python,pandas,matplotlib,seaborn,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 ... 我想要绘制的条形图: 如果有人知道如何用Seaborn和我的数据绘制这种条形图,我将不胜感激。根据您提供的数据,无法创建绘图,因此我制作了一个小样本进行测试。时间有点长,因为你需要处理数据。其主要思想是理解叠加条形图是加性规则条形图 import
1,2,3
2007,05,06
2007,05,06
2007,05,08
2007,05,08
2007,05,12
2007,05,15
2007,05,16
...
我想要绘制的条形图:
如果有人知道如何用Seaborn和我的数据绘制这种条形图,我将不胜感激。根据您提供的数据,无法创建绘图,因此我制作了一个小样本进行测试。时间有点长,因为你需要处理数据。其主要思想是理解叠加条形图是加性规则条形图
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()
这个过程可以增加到包括所有12个月,但我不知道有哪一个代码可以在不操纵数据的情况下做到这一点。使用pandas,您可以简单地使用:
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()
只需使用内置的“是否在1=年、2=月、3=值内完成”列?或者它们都与时间有关,你在计算?@Leb 1=年,2=月(3在这里不重要,不包括在条形图中),正如你所看到的例子,一个基于月,另一个基于年。例如,以月份为基础,我计算所有1月份。在我的年份范围内,我认为这意味着:1=年,2=值,其中每年有12行,每行是特定月份的值。如果2=月(月数,例如1=一月,您不应该有(2007,05)多次!我收到一个错误“初始值必须是unicode或None,而不是list”