【问题标题】:Plotting with Seaborn使用 Seaborn 进行绘图
【发布时间】:2016-05-26 09:32:15
【问题描述】:

我只是想知道如何在 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 绘制这种条形图,我将不胜感激。

【问题讨论】:

  • 只要使用内置的pandas plotting
  • 您的列是否在 1 = 年、2 = 月、3 = 值中完成?或者它们都与时间有关,而您正在计数?
  • @Leb 1= 年,2=月(3 在这里不重要,不包括在条形图中)如您所见,一个基于月,另一个基于年。例如,基于月份,我计算了我一年中的所有一月
  • 我认为这意味着:1=year, 2=value 每年有 12 行,每行是特定月份的值。如果 2=month(月份数,例如 1=january,则 (2007,05) 不应超过一次!

标签: python pandas matplotlib seaborn


【解决方案1】:

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

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 个月,但我不知道有一个代码可以在不处理数据的情况下做到这一点。

【讨论】:

  • 我收到一个错误“initial_value must be unicode or None, not list”
【解决方案2】:

使用 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()

【讨论】:

    猜你喜欢
    • 2021-01-21
    • 2021-03-14
    • 2018-10-06
    • 2020-01-14
    • 2019-01-04
    • 2021-07-28
    • 2021-05-12
    相关资源
    最近更新 更多