首页 > 解决方案 > 有没有一种方法可以在一个图中创建堆叠图,或者在一个图中使用带有 matplot/seaborn 的堆叠 Y 轴创建线?

问题描述

我是数据框可视化的新手,我正在探索这些方法,但我似乎无法找到一种方法来创建我需要的非常具体的情节。

我有一个像下面这样的数据框,其中我有日期时间作为索引和 4 个配置文件(而可能有更多列对绘图不感兴趣):

datetime                                                        
2019-06-11 00:00:00  28.97  38.47    NaN  41.47   
2019-06-11 01:00:00  28.83  38.42    NaN  41.48   
2019-06-11 02:00:00  28.72  38.38    NaN  41.49   
2019-06-11 03:00:00  28.56  38.33    NaN  41.49   
2019-06-11 04:00:00  28.36  38.22    NaN  41.51

我的目标是创建一个具有描述规范的情节:

  1. 线图,每个配置文件一个,但都在一个图中。

  2. 线条不应相交,因此轮廓应堆叠在另一个之上,最好将轮廓 1 放在最顶部。

  3. 这些值不应改变,因此 Y 轴可能应该堆叠。

  4. 图例应该是 4 个配置文件的整个图例之一。

  5. 不应出现具有 NaN 值的配置文件的图或线。

如果您能提出建议或指导我完成解决方案,我将不胜感激?

此外,是否有一个包含示例的简短结构化指南,您会向我推荐这些示例,以便在可视化中获得一些良好的基础知识?我更喜欢通勤时可以通过平板电脑打印或阅读的东西。

谢谢您的意见 :-)

标签: pythonpandasdataframematplotlibseaborn

解决方案


可能会对您有所帮助:

df[3] = pd.to_numeric(df[3], errors = 'coerce').fillna(0)
df = df.rename(columns = {1:'A',2:'B',3:'C',4:'D'})
df = df.set_index(0)
df

Out[1]:

                        A      B    C    D
                 0              
2019-06-11 00:00:00 28.97   38.47   0.0 41.47
2019-06-11 01:00:00 28.83   38.42   0.0 41.48
2019-06-11 02:00:00 28.72   38.38   0.0 41.49
2019-06-11 03:00:00 28.56   38.33   0.0 41.49
2019-06-11 04:00:00 28.36   38.22   0.0 41.51


import matplotlib.dates as mdates


ax = [None]*4

fig = plt.figure()
f, (ax[0], ax[1], ax[2], ax[3]) = plt.subplots(4, 1, sharex=True)

ax[3].set_xlabel('Hours')

color = ['r','g','b','y']
for i in range(4):
    col = df.columns[i]
    _ = ax[i].plot(df.index,df[col], label = col, c = color[i])

xfmt = mdates.DateFormatter('%H:%M')
ax[3].xaxis.set_major_formatter(xfmt)
ax[3].xaxis.set_major_locator(mdates.HourLocator(byhour=range(24)))


_ = f.legend()

在此处输入图像描述


推荐阅读