使用不同线条样式绘制Pandas数据帧子图

4

我正在使用matplotlib.plot绘制一个有6个坐标轴的图形,每个坐标轴都有来自2个Pandas数据框中的3条线系列(每列1条线)。

import pandas as pd
import matplotlib.pyplot as plt

idx = pd.DatetimeIndex(start = '2013-01-01 00:00', periods =24,freq = 'H')
df1 = pd.DataFrame(index = idx, columns = ['line1','line2','line3'])
df1['line1']=  df1.index.hour
df1['line2'] = 24 - df1['line1']
df1['line3'] = df1['line1'].mean()
df2 = df1*2
df3= df1/2
df4= df2+df3

fig, ax = plt.subplots(2,2,squeeze=False,figsize = (10,10))
ax[0,0].plot(df1.index, df1,  marker='', linewidth=1, alpha=1)
ax[0,1].plot(df2.index, df2, marker='', linewidth=1, alpha=1)
ax[1,0].plot(df3.index, df3, marker='', linewidth=1, alpha=1)
ax[1,1].plot(df4.index, df4, marker='', linewidth=1, alpha=1)
fig.show()

一切都很好,matplotlib会自动为每条线循环使用不同的颜色,但对于每个图形,使用相同的颜色,这正是我想要的。

然而,现在我想为每条线指定更多细节:选择每条线的特定颜色和/或更改每条线的线型。 此链接显示了如何将多个线型传递给Pandas绘图。例如,使用:

 ax = df.plot(kind='line', style=['-', '--', '-.'])

所以我需要做到以下两种方法之一:
  1. 将样式列表传递给我的上面的subplot命令,但是“style”未被识别,并且它不接受“linestyle”或“color”的列表。有什么办法可以做到这一点吗?
    或者
  2. 使用df.plot

    fig, ax = plt.subplots(2,2,squeeze=False,figsize = (10,10)) ax[0,0] = df1.plot(style=['-','--','-.'], marker='', linewidth=1, alpha=1) ax[0,1] = df2.plot(style=['-','--','-.'],marker='', linewidth=1, alpha=1) ax[1,0] = df3.plot( style=['-','--','-.'],marker='', linewidth=1, alpha=1) ax[1,1] = df4.plot(style=['-','--','-.'], marker='', linewidth=1, alpha=1) fig.show()

...但是然后每个图都会被绘制为单独的图形。我无法想象如何将多个Pandas图绘制在同一张图表上。
我该如何使其中任何一种方法起作用?

1
请提供一个最小可复现示例 [mcve]。从您展示的不完整代码片段来看,似乎您只是将同一数据框绘制了3次(这没有太多意义,对吧?) - ImportanceOfBeingErnest
是的,我道歉。我试图简化代码,结果有点过头了。df1和df2是包含数据框的字典,所以每个图都是不同的。我会花时间制作一个更完整的示例。 - doctorer
@ImportanceOfBeingErnest 我已经更新了问题 - 希望它是最小的、完整的和可验证的。 - doctorer
抱歉,我现在用了旧的例子来回答下面的问题。现在我懒得改成新的例子了。原则应该是一样的吧。 - ImportanceOfBeingErnest
1个回答

8

使用matplotlib

使用matplotlib,您可以为轴定义一个循环器,以便自动循环颜色和线条样式。 (请参见此答案)。

import numpy as np; np.random.seed(1)
import pandas as pd
import matplotlib.pyplot as plt

f = lambda i: pd.DataFrame(np.cumsum(np.random.randn(20,3),0))
dic1= dict(zip(range(3), [f(i) for i in range(3)]))
dic2= dict(zip(range(3), [f(i) for i in range(3)]))
dics = [dic1,dic2]
rows = range(3)

def set_cycler(ax):
    ax.set_prop_cycle(plt.cycler('color', ['limegreen', '#bc15b0', 'indigo'])+
                      plt.cycler('linestyle', ["-","--","-."]))

fig, ax = plt.subplots(3,2,squeeze=False,figsize = (8,5))
for x in rows:
    for i,dic in enumerate(dics):
        set_cycler(ax[x,i])
        ax[x,i].plot(dic[x].index, dic[x],  marker='', linewidth=1, alpha=1)
    
plt.show()

在此处输入图片描述

使用Pandas

使用Pandas,您确实可以向df.plot()方法提供一系列可能的颜色和线条样式。此外,您需要告诉它在哪个轴上绘制(df.plot(ax=ax[i,j]))。

import numpy as np; np.random.seed(1)
import pandas as pd
import matplotlib.pyplot as plt


f = lambda i: pd.DataFrame(np.cumsum(np.random.randn(20,3),0))
dic1= dict(zip(range(3), [f(i) for i in range(3)]))
dic2= dict(zip(range(3), [f(i) for i in range(3)]))
dics = [dic1,dic2]
rows = range(3)

color = ['limegreen', '#bc15b0', 'indigo']
linestyle = ["-","--","-."]

fig, ax = plt.subplots(3,2,squeeze=False,figsize = (8,5))
for x in rows:
    for i,dic in enumerate(dics):
        dic[x].plot(ax=ax[x,i], style=linestyle, color=color, legend=False)
        
    
plt.show()

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接