【问题标题】:Filling between two lines on python在python上的两行之间填充
【发布时间】:2020-09-16 00:25:41
【问题描述】:

我有以下公式:

ax = plt.gca()
datamax.plot(kind='line',x='Date',y='Data_Value',color='red',ax=ax)
datamin.plot(kind='line',x='Date',y='Data_Value', color='blue',ax=ax)
plt.ylabel("Temperature (degrees C)",color='navy')
plt.xlabel("Date",color='navy',labelpad=15)
plt.title('Record high and low temperatures by day (2005-2014)', alpha=1.0,color='brown')
ax.legend(loc='upper center', bbox_to_anchor=(0.5, -0.35),
          fancybox=False,labels=['Record high','Record low'])
plt.xticks(rotation=30)
plt.gca().fill_between(datamax['Date'],datamax['Data_Value'],datamin['Data_Value'],facecolor='yellow',alpha=0.25)
plt.show()

我想在下面折线图的两条线之间进行填充,但不知何故我的代码无法正常工作。谁能帮助理解为什么?

我认为 fill_between 命令会起作用,但由于某种原因它不是...

当我尝试时:

ax.fill_between(datamax['Date'],datamax['Data_Value'],datamin['Data_Value'],facecolor='yellow',alpha=0.25)

我收到错误消息:

输入类型不支持 ufunc 'isfinite',并且根据转换规则 ''safe'' 无法安全地将输入强制转换为任何支持的类型

我的图表目前如下所示:

数据框 datamax 如下所示:

 Date           ID Element  Data_Value
0     2005-01-01  USW00094889    TMAX         156
1     2005-01-02  USW00094889    TMAX         139
2     2005-01-03  USW00094889    TMAX         133
3     2005-01-04  USW00094889    TMAX          39
4     2005-01-05  USW00094889    TMAX          33
5     2005-01-06  USW00094889    TMAX           0
6     2005-01-07  USW00094889    TMAX           6
7     2005-01-08  USW00094889    TMAX          17
8     2005-01-09  USW00094889    TMAX          28
9     2005-01-10  USW00094889    TMAX          44
10    2005-01-11  USW00094889    TMAX          44
11    2005-01-12  USW00094889    TMAX         139
12    2005-01-13  USW00094889    TMAX         161
13    2005-01-14  USW00094889    TMAX         150
14    2005-01-15  USW00094889    TMAX         -33
15    2005-01-16  USW00094889    TMAX         -33
16    2005-01-17  USW00094889    TMAX         -50
17    2005-01-18  USW00094889    TMAX         -33
18    2005-01-19  USW00094889    TMAX          11
19    2005-01-20  USW00094889    TMAX          11
20    2005-01-21  USW00094889    TMAX         -39
21    2005-01-22  USW00094889    TMAX         -72
22    2005-01-23  USW00094889    TMAX         -44
23    2005-01-24  USW00094889    TMAX          11
24    2005-01-25  USW00094889    TMAX          28
25    2005-01-26  USW00094889    TMAX          28
26    2005-01-27  USW00094889    TMAX           6
27    2005-01-28  USW00094889    TMAX         -11
28    2005-01-29  USW00094889    TMAX          17
29    2005-01-30  USW00094889    TMAX          28
...          ...          ...     ...         ...
3603  2014-11-13  USW00094889    TMAX          39
3604  2014-11-14  USW00094889    TMAX          33
3605  2014-11-15  USW00094889    TMAX          28
3606  2014-11-16  USW00094889    TMAX          28
3607  2014-11-17  USW00094889    TMAX          17
3608  2014-11-18  USW00094889    TMAX          11
3609  2014-11-19  USW00094889    TMAX          11
3610  2014-11-20  USW00094889    TMAX           6
3611  2014-11-21  USW00094889    TMAX         -10
3612  2014-11-22  USW00094889    TMAX         106
3613  2014-11-23  USW00094889    TMAX         156
3614  2014-11-24  USW00094889    TMAX         172
3615  2014-11-25  USW00094889    TMAX         172
3616  2014-11-26  USW00094889    TMAX          28
3617  2014-11-27  USW00094889    TMAX          39
3618  2014-11-28  USW00094889    TMAX          22
3619  2014-11-29  USW00094889    TMAX         117
3620  2014-11-30  USW00094889    TMAX         178
3621  2014-12-01  USW00094889    TMAX         172
3622  2014-12-02  USW00094889    TMAX          33
3623  2014-12-03  USW00094889    TMAX          61
3624  2014-12-04  USW00094889    TMAX          50
3625  2014-12-05  USW00094889    TMAX          50
3626  2014-12-06  USW00094889    TMAX          67
3627  2014-12-07  USW00094889    TMAX          67
3628  2014-12-08  USW00094889    TMAX          72
3629  2014-12-09  USW00094889    TMAX          56
3630  2014-12-10  USW00094889    TMAX          50
3631  2014-12-11  USW00094889    TMAX          61
3632  2014-12-12  USW00094889    TMAX          50

[3631 rows x 4 columns]

数据框 datamin 像这样:

 Date           ID Element  Data_Value
0     2005-01-01  USC00200032    TMIN         -56
1     2005-01-02  USC00200032    TMIN         -56
2     2005-01-03  USC00200032    TMIN           0
3     2005-01-04  USC00200032    TMIN         -39
4     2005-01-05  USC00200032    TMIN         -94
5     2005-01-06  USC00200032    TMIN        -106
6     2005-01-07  USC00200032    TMIN        -111
7     2005-01-08  USC00200032    TMIN        -100
8     2005-01-09  USC00200032    TMIN         -67
9     2005-01-10  USC00200032    TMIN         -56
10    2005-01-11  USC00200032    TMIN         -22
11    2005-01-12  USC00200032    TMIN         -17
12    2005-01-13  USC00200032    TMIN         -83
13    2005-01-14  USC00200032    TMIN        -128
14    2005-01-15  USC00200032    TMIN        -144
15    2005-01-16  USC00200032    TMIN        -150
16    2005-01-17  USC00200032    TMIN        -189
17    2005-01-18  USC00200032    TMIN        -217
18    2005-01-19  USC00200228    TMIN        -300
19    2005-01-20  USC00200032    TMIN        -156
20    2005-01-21  USC00200032    TMIN        -178
21    2005-01-22  USC00200032    TMIN        -178
22    2005-01-23  USC00200032    TMIN        -250
23    2005-01-24  USC00200032    TMIN        -267
24    2005-01-25  USC00200032    TMIN        -228
25    2005-01-26  USC00200032    TMIN        -206
26    2005-01-27  USC00200032    TMIN        -239
27    2005-01-28  USC00200032    TMIN        -250
28    2005-01-29  USC00200032    TMIN        -222
29    2005-01-30  USC00200228    TMIN        -217
...          ...          ...     ...         ...
3603  2014-11-13  USC00200032    TMIN         -71
3604  2014-11-14  USC00200032    TMIN         -78
3605  2014-11-15  USC00200032    TMIN         -94
3606  2014-11-16  USC00200032    TMIN         -72
3607  2014-11-17  USC00200032    TMIN        -106
3608  2014-11-18  USC00200032    TMIN        -144
3609  2014-11-19  USC00200032    TMIN        -128
3610  2014-11-20  USC00200032    TMIN        -122
3611  2014-11-21  USC00200032    TMIN        -182
3612  2014-11-22  USC00200032    TMIN        -172
3613  2014-11-23  USC00200032    TMIN        -100
3614  2014-11-24  USC00200032    TMIN          -5
3615  2014-11-25  USC00200032    TMIN         -33
3616  2014-11-26  USC00200032    TMIN         -67
3617  2014-11-27  USC00200032    TMIN         -82
3618  2014-11-28  USC00200032    TMIN        -133
3619  2014-11-29  USC00200032    TMIN        -106
3620  2014-11-30  USC00200032    TMIN         -56
3621  2014-12-01  USC00200032    TMIN         -88
3622  2014-12-02  USC00200032    TMIN         -99
3623  2014-12-03  USC00200032    TMIN         -71
3624  2014-12-04  USC00200032    TMIN         -77
3625  2014-12-05  USC00200032    TMIN         -61
3626  2014-12-06  USC00200032    TMIN         -50
3627  2014-12-07  USC00200032    TMIN         -78
3628  2014-12-08  USC00200032    TMIN         -78
3629  2014-12-09  USC00200032    TMIN         -39
3630  2014-12-10  USC00200032    TMIN         -72
3631  2014-12-11  USC00200032    TMIN         -88
3632  2014-12-12  USC00200032    TMIN         -78

[3631 rows x 4 columns]

【问题讨论】:

  • 尽量不要混合使用 pandas 绘图和直接调用 matplotlib 方法。在这种情况下,我会坚持使用裸 matplotlib,因为 pandas 会做一些聪明但与原始 matplotlib 不同的事情。始终明确地作用于轴(即ax.fill_between,而不是plt.gca().fill_between
  • @PaulH 请在上面查看我的编辑!
  • 看起来您的数据框中有一些错误数据
  • @PaulH 你是什么意思坏数据?

标签: python pandas matplotlib plot visualization


【解决方案1】:
  1. Python 代码返回 2005 年至 2014 年期间按年记录的最高气温和最低气温的折线图。每天的最高气温和最低气温之间的区域应加阴影。
  2. 然后,将 2015 年数据的散点图叠加在 2015 年打破十年记录(2005-2014 年)记录高点或记录低点的任何点(高点和低点)。
  3. 删除闰年日期(即 2 月 29 日)。

/

from datetime import datetime
import pandas as pd
import matplotlib.pyplot as plt

pd.set_option("display.max_rows",None,"display.max_columns",None)
data = pd.read_csv('data/C2A2_data/BinnedCsvs_d400/fb441e62df2d58994928907a91895ec62c2c42e6cd075c2700843b89.csv') 
newdata = data[(data['Date'] >= '2005-01-01') & (data['Date'] <= '2014-12-12')]
datamax = newdata[newdata['Element']=='TMAX']
datamin = newdata[newdata['Element']=='TMIN']
datamax['Date'] = pd.to_datetime(datamax['Date'])
datamin['Date'] = pd.to_datetime(datamin['Date'])
datamax["day_of_year"] = datamax["Date"].dt.dayofyear
datamax = datamax.groupby('day_of_year').max()
datamin["day_of_year"] = datamin["Date"].dt.dayofyear
datamin = datamin.groupby('day_of_year').min()
datamax = datamax.reset_index()
datamin = datamin.reset_index()
datamin['Date'] = datamin['Date'].dt.strftime('%Y-%m-%d')
datamax['Date'] = datamax['Date'].dt.strftime('%Y-%m-%d')
datamax = datamax[~datamax['Date'].str.contains("02-29")]
datamin = datamin[~datamin['Date'].str.contains("02-29")]

breakoutdata = data[(data['Date']  > '2014-12-31')]
datamax2015 = breakoutdata[breakoutdata['Element']=='TMAX']
datamin2015 = breakoutdata[breakoutdata['Element']=='TMIN']
datamax2015['Date'] = pd.to_datetime(datamax2015['Date'])
datamin2015['Date'] = pd.to_datetime(datamin2015['Date'])
datamax2015["day_of_year"] = datamax2015["Date"].dt.dayofyear
datamax2015 = datamax2015.groupby('day_of_year').max()
datamin2015["day_of_year"] = datamin2015["Date"].dt.dayofyear
datamin2015 = datamin2015.groupby('day_of_year').min()
datamax2015 = datamax2015.reset_index()
datamin2015 = datamin2015.reset_index()
datamin2015['Date'] = datamin2015['Date'].dt.strftime('%Y-%m-%d')
datamax2015['Date'] = datamax2015['Date'].dt.strftime('%Y-%m-%d')
datamax2015 = datamax2015[~datamax2015['Date'].str.contains("02-29")]
datamin2015 = datamin2015[~datamin2015['Date'].str.contains("02-29")]

dataminappend = datamin2015.join(datamin,on="day_of_year",rsuffix="_new")
lower = dataminappend.loc[dataminappend["Data_Value_new"]>dataminappend["Data_Value"]]
datamaxappend = datamax2015.join(datamax,on="day_of_year",rsuffix="_new")
upper = datamaxappend.loc[datamaxappend["Data_Value_new"]<datamaxappend["Data_Value"]]

upper['Date'] = pd.to_datetime(upper['Date']) 
lower['Date'] = pd.to_datetime(lower['Date']) 
datamax['Date'] = pd.to_datetime(datamax['Date']) 
datamin['Date'] = pd.to_datetime(datamin['Date']) 

ax = plt.gca()
plt.plot(datamax['day_of_year'],datamax['Data_Value'],color='red')
plt.plot(datamin['day_of_year'],datamin['Data_Value'], color='blue')
plt.scatter(upper['day_of_year'],upper['Data_Value'],color='purple')
plt.scatter(lower['day_of_year'],lower['Data_Value'], color='cyan')

plt.ylabel("Temperature (degrees C)",color='navy')
plt.xlabel("Day of the year",color='navy',labelpad=15)
plt.title('Record high and low temperatures by day between 2005-2014)', alpha=1.0,color='brown',y=1.08)
ax.legend(loc='upper center', bbox_to_anchor=(0.5, -0.35),fancybox=False,labels=['Record high','Record low'])
plt.xticks(rotation=30)
plt.fill_between(range(len(datamax['Date'])), datamax['Data_Value'], datamin['Data_Value'],color='yellow',alpha=0.8)
plt.show()

/

  1. 我已使用 Datamin['Date'] = datamin['Date'].dt.strftime('%Y-%m-%d') 将“日期”列转换为字符串。

  2. 然后我使用 upper['Date'] = pd.to_datetime(upper['Date']) 将其转换回 'datetime' 格式

  3. 然后我使用“日期”作为 x 值。

【讨论】:

    【解决方案2】:

    你可以试试

    plt.fill_between(datamax['Date'],datamax['Data_Value'],datamin['Data_Value'],facecolor='yellow',alpha=0.25)
    

    代替

    plt.gca().fill_between(datamax['Date'],datamax['Data_Value'],datamin['Data_Value'],facecolor='yellow',alpha=0.25)
    

    【讨论】:

    • 应该在 plt.fill_between 之前使用 ax.fill_between,这会在后台调用 plt.gca().fill_between
    • ufunc 'isfinite' 不支持输入类型,并且根据转换规则 ''safe'' 无法安全地将输入强制转换为任何支持的类型
    • @sam 这是我收到的错误消息。您认为我的数据有什么问题?
    • 这似乎与数据报中系列的dtype有关。如果不是这样,您可以将类型更改为 float/int64 吗?
    • ValueError: 无法将字符串转换为浮点数:'2014-12-12'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 2020-01-18
    • 2021-07-12
    • 2014-11-04
    相关资源
    最近更新 更多