【问题标题】:How to create a multi-line plot for my dataset?如何为我的数据集创建多线图?
【发布时间】:2018-01-14 20:22:04
【问题描述】:

我有以下 pandas DataFrame df

df = pd.DataFrame(columns=["Event1", "Event2", "Event3"], 
                                data=[[15,1,22],
                                      [16,1.26,80],
                                      [27,0,15]])

df = df.set_index([["Series1", "Series2", "Series3"]])

我想创建一个 X 轴包含 Event1Event2Event3 的多线图,而 Y 轴应该是对应的数值。应该有3个系列:Series1Series2Series3

如何在sns.pointplot(x=???, y=???, hue=???,data=df) 中定义xyhue

plt.figure(figsize=(12,8))
ax = sns.pointplot(x=???, y=???, hue=???,data=df)
ax.grid(b=True, which='major', color='#d3d3d3', linewidth=1.0)
ax.grid(b=True, which='minor', color='#d3d3d3', linewidth=0.5)
plt.show()

【问题讨论】:

  • 目标是使用sns.pointplot 还是获得所需情节的最简单方法?
  • @ImportanceOfBeingErnest:理想情况下,我想使用 seaborn 的 pointplot。但我也接受纯粹的matplotlib

标签: python pandas matplotlib dataframe seaborn


【解决方案1】:

将作为数据透视表的 df 重组为经典数据框并根据需要进行绘图:

import matplotlib.pylab as plt
import pandas as pd
import seaborn as sns

df = pd.DataFrame(columns=["Event1", "Event2", "Event3"], 
                                data=[[15,1,22],
                                      [16,1.26,80],
                                      [27,0,15]])
df = df.set_index([["Series1", "Series2", "Series3"]])
print(df)

# reorganize df to classic table
df2=df.stack().reset_index()
df2.columns = ['Series','Event','Values']
print(df2)

plt.figure(figsize=(12,8))
ax = sns.pointplot(x='Event', y='Values', hue='Series',data=df2)
ax.grid(b=True, which='major', color='#d3d3d3', linewidth=1.0)
ax.grid(b=True, which='minor', color='#d3d3d3', linewidth=0.5)
plt.show()

df2:

    Series   Event  Values
0  Series1  Event1   15.00
1  Series1  Event2    1.00
2  Series1  Event3   22.00
3  Series2  Event1   16.00
4  Series2  Event2    1.26
5  Series2  Event3   80.00
6  Series3  Event1   27.00
7  Series3  Event2    0.00
8  Series3  Event3   15.00

【讨论】:

  • 我有一个数据框,我想绘制多年和数月的计数,这太好了,谢谢。 ax = sns.lineplot(x='month', y='Count', hue='year',data=Cov)
【解决方案2】:

我不确定如何使用 seaborn,但使用 matplolib 是这样的:

for i in df.index.values:
    plt.plot(list(df.loc[i]))
plt.show()

在这种情况下,X ax 将采用值 0、1 和 2,而 Y ax 将采用您的行的值。只需在最后执行plt.show() 即可将所有图集中在一个图中。在 seaborn 中应该以同样的方式工作。

【讨论】:

    【解决方案3】:

    获得所需绘图的最简单方法是df.T.plot()

    import pandas as pd
    
    df = pd.DataFrame(columns=["Event1", "Event2", "Event3"], 
                                    data=[[15,1,22],
                                          [16,1.26,80],
                                          [27,0,15]])
    
    df = df.set_index([["Series1", "Series2", "Series3"]])
    
    df.T.plot()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-11
      • 1970-01-01
      • 2019-04-05
      • 2018-03-28
      • 2018-06-02
      • 1970-01-01
      • 2021-12-07
      • 1970-01-01
      相关资源
      最近更新 更多