【问题标题】:Plot many time-series columns in one graph在一张图中绘制许多时间序列列
【发布时间】:2021-12-17 22:11:34
【问题描述】:

我有一个包含大约 100 列的大数据框,我试图在一张图中绘制所有时间序列。有没有一种简单的方法来处理它,而无需手动指定每个 y 轴?

这将是一个具有以下时间序列的简单示例:02K W03K W04K W

import pandas as pd
import matplotlib.pyplot as plt

df1 = pd.DataFrame({
    'Date':['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04', '2021-01-05'],
    'index':[0, 1, 2, 3, 4], 
    '02K W':[3.5, 0.1, 3, 'nan', 0.2], 
    '03K W':[4.2, 5.2, 2.5, 3.0, 0.6], 
    '04K W':[1.5, 2.6, 8.2, 4.2, 5.3]}) 

df1['Date'] = pd.to_datetime(df1['Date'])
df1 = df1.set_index('index')

到目前为止,我手动指定所有 y 轴来绘制各个时间序列。

plt.plot(df1['Date'], df1['02K W'])
plt.plot(df1['Date'], df1['03K W'])
plt.plot(df1['Date'], df1['04K W'])

有没有更优雅的方式来指定绘图的相关列?

【问题讨论】:

  • 使用 for 循环。遍历列名列表
  • 您是否在 02K W...03K W 等中看到了模式。如果是这样,只需使用迭代器。
  • 不,没有特定的模式,我尝试绘制除索引和日期列之外的所有内容。
  • df.plot(x='Date').

标签: python pandas dataframe matplotlib


【解决方案1】:
import pandas as pd
import matplotlib.pyplot as plt

df1 = pd.DataFrame({
    'Date':['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04', '2021-01-05'],
    'index':[0, 1, 2, 3, 4], 
    '02K W':[3.5, 0.1, 3, 'nan', 0.2], 
    '03K W':[4.2, 5.2, 2.5, 3.0, 0.6], 
    '04K W':[1.5, 2.6, 8.2, 4.2, 5.3]}) 

df1['Date'] = pd.to_datetime(df1['Date'])
df1 = df1.set_index('index')

for col in df1.colums[1:]:
    plt.plot(df1['Date'], df1[col])

【讨论】:

    【解决方案2】:

    您可以melt您的列并使用seaborn.lineplot

    import seaborn as sns
    
    sns.lineplot(data=df1.replace('nan', float('nan')).melt(id_vars=['Date']),
                 x='Date', y='value', hue='variable'
                )
    

    输出:

    【讨论】:

      【解决方案3】:

      有没有更优雅的方式来指定绘图的相关列? ... [我正在尝试] 绘制除索引和日期列之外的所有内容。

      Date 设置为索引,这将覆盖当前的index 索引。这将留下除indexDate 之外的所有列,因此您可以使用DataFrame.plot

      df1.set_index('Date').plot()
      

      或者Quang commented,使用x='Date'

      df1.plot(x='Date')
      

      请注意,您的示例数据中有一个'nan' 字符串。如果在您的真实数据中是这样,您应该将它们转换为真实的np.nan,例如,使用pd.to_numericDataFrame.replace

      【讨论】: