【问题标题】:Plotting multiple sets of dataframes on the same graph with multiple figures在具有多个图形的同一图表上绘制多组数据框
【发布时间】:2016-10-21 23:41:57
【问题描述】:

我试图在同一张图上绘制两个数据框。我想这样做五次以产生五个不同的图形,以便它们可以保存为单独的文件以便以后使用。但是,我无法在同一张图上获得这两组数据。当我在网格中有多个子图时,我知道如何在同一个图上绘制两组数据,以及在同一个图上不使用数据框时如何绘制两组数据。但是,这似乎让我感到困惑。

tableau20=xcolorpallet()
f0,axes00=plt.subplots()
axes01=axes00.twinx()
df00=df00.drop('elev', 1)
ax00min=float(df00.min())
ax00max=1.05*float(df00.max())
ax00step=int((ax00max-ax00min)/10)
ax10min=float(df10.min())
ax10max=1.05*float(df10.max())
ax10step=int((ax10max-ax10min)/10)
df00.plot(linewidth=2, figsize=(9,6),color=tableau20[6])
axes00.set_ylabel(v00,fontsize=14, rotation=90)
axes00.set_ylim(ax00min,ax00max)
axes00.set_yticks(np.arange(ax00min,ax00max,ax00step))
df10.plot(fig=f0,ax=axes01,secondary_y=v10,linewidth=2,color=tableau20[14])
f0.set_title(v10,fontsize=18)
axes01.set_ylabel(v00,fontsize=14, rotation=90)
axes01.set_ylim(ax00min,ax00max)
axes01.set_yticks(np.arange(ax00min,ax00max,ax00step))
plt.show()

目前,它正在生成两个单独的图表,上面有我的数据,这很好,但不是我想要的。有什么建议吗?

以下是一些示例数据,可让您了解我要绘制的内容:

df00:

time                Temp
2014-08-16 12:02:40 68.0
2014-08-16 12:17:40 69.0
2014-08-16 12:32:40 68.0
2014-08-16 12:47:40 68.0
2014-08-16 13:02:40 68.0
2014-08-16 13:17:40 68.0
2014-08-16 13:32:40 68.0
2014-08-16 13:47:40 68.0
2014-08-16 14:02:40 68.0
2014-08-16 14:17:40 68.0
2014-08-16 14:32:39 66.0
2014-08-16 14:32:40 67.0
2014-08-16 14:47:39 66.0
2014-08-16 14:47:40 66.0
2014-08-16 15:02:40 66.0
2014-08-16 15:17:39 64.0
2014-08-16 15:17:40 65.0
...

df10:

date_time       Temperature
2014-08-16 12:00:00 17.3997
2014-08-16 13:00:00 16.9094
2014-08-16 14:00:00 16.4693
2014-08-16 15:00:00 15.9627
2014-08-16 16:00:00 15.5795
2014-08-16 17:00:00 15.5492
2014-08-16 18:00:00 15.2729
2014-08-16 19:00:00 15.2119
2014-08-16 20:00:00 15.3572
2014-08-16 21:00:00 15.497
2014-08-16 22:00:00 15.349
2014-08-16 23:00:00 15.3398
2014-08-17 00:00:00 15.5546
2014-08-17 01:00:00 14.9101
2014-08-17 02:00:00 15.279
2014-08-17 03:00:00 15.2961
2014-08-17 04:00:00 15.003
2014-08-17 05:00:00 15.4753
...

我很抱歉最初没有包含它。我认为这是一个图形问题,但它似乎在很大程度上变成了数据帧之间的兼容性问题。

【问题讨论】:

  • 您要在同一个ax 对象上绘制多个折线图然后保存,还是使用相同的格式绘制五次并分别保存?
  • 我想在同一个图表上绘制两条线,然后保存该图表。然后,我想再做五次。这里只有一次。我有其他五组数据,因为我可能并不总是在该数据框中绘制变量,所以我可能并不总是想要绘制其中一张图,因此在绘制之前使用 if 语句检查数据框是否存在。我可以向你展示整个东西的样子,但它有超过一百行代码。
  • 您使用twinx 是因为您想要两个图表吗?要在同一个图表上绘图,您宁愿使用相同的 ax 对象两次。
  • 但是当我这样做时,我收到了这个错误:ValueError: ordinal must be >= 1

标签: python-2.7 pandas matplotlib graph


【解决方案1】:

要在同一张图表上绘图,您将使用与 .plot() 相同的 ax 对象:

使用样本数据——先df1

DatetimeIndex: 17 entries, 2014-08-16 12:02:40 to 2014-08-16 15:17:40
Data columns (total 1 columns):
Temp    17 non-null int64
dtypes: int64(1)
memory usage: 272.0 bytes
None
                     Temp
time                     
2014-08-16 12:02:40    68
2014-08-16 12:17:40    69
2014-08-16 12:32:40    68
2014-08-16 12:47:40    68
2014-08-16 13:02:40    68
2014-08-16 13:17:40    68
2014-08-16 13:32:40    68
2014-08-16 13:47:40    68
2014-08-16 14:02:40    68
2014-08-16 14:17:40    68
2014-08-16 14:32:39    66
2014-08-16 14:32:40    67
2014-08-16 14:47:39    66
2014-08-16 14:47:40    66
2014-08-16 15:02:40    66
2014-08-16 15:17:39    64
2014-08-16 15:17:40    65

df2:

<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 18 entries, 2014-08-16 12:00:00 to 2014-08-17 05:00:00
Data columns (total 1 columns):
Temperature    18 non-null float64
dtypes: float64(1)
memory usage: 288.0 bytes
None
                     Temperature
date_time                       
2014-08-16 12:00:00      17.3997
2014-08-16 13:00:00      16.9094
2014-08-16 14:00:00      16.4693
2014-08-16 15:00:00      15.9627
2014-08-16 16:00:00      15.5795
2014-08-16 17:00:00      15.5492
2014-08-16 18:00:00      15.2729
2014-08-16 19:00:00      15.2119
2014-08-16 20:00:00      15.3572
2014-08-16 21:00:00      15.4970
2014-08-16 22:00:00      15.3490
2014-08-16 23:00:00      15.3398
2014-08-17 00:00:00      15.5546
2014-08-17 01:00:00      14.9101
2014-08-17 02:00:00      15.2790
2014-08-17 03:00:00      15.2961
2014-08-17 04:00:00      15.0030
2014-08-17 05:00:00      15.4753

这个:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('ggplot')

ax = df1.plot()
df2.plot(ax=ax)
plt.show()

导致DataFrame 的行更短,其中数据提前约 12 小时结束,但其他情况如预期:

【讨论】:

  • 我仍然收到ValueError: Ordinal must be &gt;=1。现在,这是在同一张图上绘制的两个不同的数据框。这有关系吗?
  • 有可能,例如索引不一致时会出现此错误。您能否将两个 Series 合并到一个 DataFrame 中,或者两者都使用 .reset_index(drop=True)?我看到的另一个原因是DateTimeIndex
  • 我知道他们在不同的日期时间。一个来自观察,具有 15 分钟的非工作时间步长,而另一个是具有每小时时间步长的建模行为。因此,如果我将两个数据帧组合在一起,我将丢失一个数据帧的所有数据。如何将数据叠加在一个图表上,并使用相同的 x 轴,同时具有不同的 x 步长,因为这似乎是问题所在。
  • 您可以有不同的 x-steps,但原则上应该能够使用例如合并 index 上的两个系列。 pd.concat()。如果不是,indexes 不一致,因此pandas 将很难使用相同的 x 轴将它们绘制在同一图表上。另一方面,您可以返回使用ax2=ax1.twinx 创建单独的轴,如下所述:stackoverflow.com/questions/24183101/…
  • 即使我这样做了,(我之前尝试过),我得到ValueError: ordinal &gt;=1。除非,我在我有较大时间步长的地方首先绘制图表。然后,我只会让更大的时间步长数据框出现在图表上,即使图例说两个数据框都被绘制出来了。
猜你喜欢
  • 2021-03-11
  • 2022-01-09
  • 1970-01-01
  • 2019-07-15
  • 1970-01-01
  • 2016-12-05
  • 2021-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多