如何使用 fill_ Between 创建按月的最小-最大图

Abr*_*rar 3 python matplotlib pandas

我必须将月份名称显示为 xticks,当我绘制图形并将 x 作为月份名称传递时,它会绘制错误。我还必须在线图上叠加散点图。

我无法在此处粘贴完整的代码,因为它是 MOOC 作业,我只是在寻找我在这里做错了什么。

plt.figure(figsize=(8,5))

plt.plot(mint['Mean'],linewidth= 1, label = 'Minumum')
plt.plot(maxt['Mean'],linewidth = 1, label = 'Maximum')

plt.scatter(broken_low,mint15.iloc[broken_low]['Mean'],alpha = 0.75)
plt.scatter(broken_high,maxt15.iloc[broken_high]['Mean'],alpha = .75)
Run Code Online (Sandbox Code Playgroud)

数据集链接在这里:

https://drive.google.com/file/d/1qJnnHDK_0ghmHQl4OuyKDr-0K5ETo7Td/view?usp=sharing

这是它的外观的一个想法

它应该看起来像这样,填充线之间的面积,x 轴为月份,y 轴为摄氏度

Tre*_*ney 5

使用 OP 中的数据进行更新

\n
    \n
  • 第一种方法的问题是它要求 x 轴是日期时间格式。
  • \n
  • 问题中的数据正在根据字符串进行分组和绘制,该字符串是月份和日期的组合
  • \n
  • x 轴代表 365 天,闰年已被删除。\n
      \n
    • 在每个月初的适当位置打勾
    • \n
    • 为刻度线添加标签
    • \n
    \n
  • \n
  • 这似乎来自coursera:Applied Data Science with Python Specialization
  • \n
\n
import pandas as pd\nimport matplotlib.pyplot as plot\nimport calendar\n\n# load the data\nurl = \'https://raw.githubusercontent.com/trenton3983/stack_overflow/master/data/so_data/2020-07-17_62929123/temperature.csv\'\ndf = pd.read_csv(url, parse_dates=[\'Date\'])\n\n# remove leap day\ndf = df[~((df.Date.dt.month == 2) & (df.Date.dt.day == 29))]\n\n# add a year column\ndf[\'Year\'] = df.Date.dt.year\n\n# add a month-day column to use for groupby\ndf[\'Month-Day\'] = df.Date.dt.month.astype(\'str\') + \'-\' + df.Date.dt.day.astype(\'str\')\n\n# select 2015 data\ndf_15 = df[df.Year == 2015].copy().reset_index()\n\n# select data before 2015\ndf_14 = df[df.Year < 2015].copy().reset_index()\n\n# filter data to either max or min and groupby month-day\nmax_14 = df_14[df_14.Element == \'TMAX\'].groupby([\'Month-Day\']).agg({\'Data_Value\': max}).reset_index().rename(columns={\'Data_Value\': \'Daily_Max\'})\nmin_14 = df_14[df_14.Element == \'TMIN\'].groupby([\'Month-Day\']).agg({\'Data_Value\': min}).reset_index().rename(columns={\'Data_Value\': \'Daily_Min\'})\nmax_15 = df_15[df_15.Element == \'TMAX\'].groupby([\'Month-Day\']).agg({\'Data_Value\': max}).reset_index().rename(columns={\'Data_Value\': \'Daily_Max\'})\nmin_15 = df_15[df_15.Element == \'TMIN\'].groupby([\'Month-Day\']).agg({\'Data_Value\': max}).reset_index().rename(columns={\'Data_Value\': \'Daily_Min\'})\n\n# select max values from 2015 that are greater than the recorded max\nhigher_14 = max_15[max_15 > max_14]\n\n# select min values from 2015 that are less than the recorded min\nlower_14 = min_15[min_15 < min_14]\n\n# plot the min and max lines\nax = max_14.plot(label=\'Max Recorded\', color=\'tab:red\', figsize=(12, 8))\nmin_14.plot(ax=ax, label=\'Min Recorded\', color=\'tab:blue\')\n\n# add the fill, between min and max\nplt.fill_between(max_14.index, max_14.Daily_Max, min_14.Daily_Min, alpha=0.10, color=\'tab:orange\')\n\n# add points greater than max or less than min\nplt.scatter(higher_14.index, higher_14.Daily_Max, label=\'2015 Max > Record\', alpha=0.75, color=\'tab:red\')\nplt.scatter(lower_14.index, lower_14.Daily_Min, label=\'2015 Min < Record\', alpha=0.75, color=\'tab:blue\')\n\n# set plot xlim\nplt.xlim(-5, 370)\n\n# tick locations\nticks=[-5, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365, 370]\n\n# tick labels\nlabels = list(calendar.month_abbr)  # list of months\nlabels.extend([\'Jan\', \'\'])\n\n# add the custom ticks and labels\nplt.xticks(ticks=ticks, labels=labels)\n\n# plot cosmetics\nplt.legend()\nplt.xlabel(\'Day of Year: 0-365 Displaying Start of Month\')\nplt.ylabel(\'Temperature \xc2\xb0C\')\nplt.title(\'Daily Max and Min: 2009 - 2014\\nRecorded Max < 2015 Temperatures < Recorded Min\')\nplt.tight_layout()\nplt.show()\n
Run Code Online (Sandbox Code Playgroud)\n

在此输入图像描述

\n

原答案

\n\n
import pandas as pd\nimport matplotlib.pyplot as plt\nimport matplotlib.dates as mdates\n\n# plot styling parameters\nplt.style.use(\'seaborn\')\nplt.rcParams[\'figure.figsize\'] = (16.0, 10.0)\nplt.rcParams["patch.force_edgecolor"] = True\n\n# locate the Month and format the label\nmonths = mdates.MonthLocator()  # every month\nmonths_fmt = mdates.DateFormatter(\'%b\')\n\n# plot the data\nfig, ax = plt.subplots()\nax.plot(max_15.index, \'rolling\', data=max_15, label=\'max rolling mean\')\nax.scatter(x=max_15.index, y=\'v\', data=max_15, alpha=0.75, label=\'MAX\')\n\nax.plot(min_15.index, \'rolling\', data=min_15, label=\'min rolling mean\')\nax.scatter(x=min_15.index, y=\'v\', data=min_15, alpha=0.75, label=\'MIN\')\nax.legend()\n\n# format the ticks\nax.xaxis.set_major_locator(months)\nax.xaxis.set_major_formatter(months_fmt)\n
Run Code Online (Sandbox Code Playgroud)\n

在此输入图像描述

\n

可重复的数据

\n\n
import pandas as pd\n\n# download data into dataframe, it\'s in a wide format\npdx_19 = pd.read_csv(\'http://www.weather.gov/source/pqr/climate/webdata/Portland_dailyclimatedata.csv\', header=6)\n\n# clean and label data\npdx_19.drop(columns=[\'AVG or Total\'], inplace=True)\npdx_19.columns = list(pdx_19.columns[:3]) + [f\'v_{day}\' for day in pdx_19.columns[3:]]\npdx_19.rename(columns={\'Unnamed: 2\': \'TYPE\'}, inplace=True)\npdx_19 = pdx_19[pdx_19.TYPE.isin([\'TX\', \'TN\', \'PR\'])]\n\n# convert to long format\npdx = pd.wide_to_long(pdx_19, stubnames=\'v\', sep=\'_\', i=[\'YR\', \'MO\', \'TYPE\'], j=\'day\').reset_index()\n\n# additional cleaning\npdx.TYPE = pdx.TYPE.map({\'TX\': \'MAX\', \'TN\': \'MIN\', \'PR\': \'PRE\'})\npdx.rename(columns={\'YR\': \'year\', \'MO\': \'month\'}, inplace=True)\npdx = pdx[pdx.v != \'-\'].copy()\npdx[\'date\'] = pd.to_datetime(pdx[[\'year\', \'month\', \'day\']])\npdx.drop(columns=[\'year\', \'month\', \'day\'], inplace=True)\npdx.v.replace({\'M\': np.nan, \'T\': np.nan}, inplace=True)\npdx.v = pdx.v.astype(\'float\')\n\n# select on 2015\npdx_2015 = pdx[pdx.date.dt.year == 2015].reset_index(drop=True).set_index(\'date\')\n\n# select only MAX temps\nmax_15 = pdx_2015[pdx_2015.TYPE == \'MAX\'].copy()\n\n# select only MIN temps\nmin_15 = pdx_2015[pdx_2015.TYPE == \'MIN\'].copy()\n\n# calculate rolling mean\nmax_15[\'rolling\'] = max_15.v.rolling(7).mean()\nmin_15[\'rolling\'] = min_15.v.rolling(7).mean()\n
Run Code Online (Sandbox Code Playgroud)\n

max_15

\n
           TYPE     v    rolling\ndate                            \n2015-01-01  MAX  39.0        NaN\n2015-01-02  MAX  41.0        NaN\n2015-01-03  MAX  41.0        NaN\n2015-01-04  MAX  53.0        NaN\n2015-01-05  MAX  57.0        NaN\n2015-01-06  MAX  47.0        NaN\n2015-01-07  MAX  51.0  47.000000\n2015-01-08  MAX  45.0  47.857143\n2015-01-09  MAX  50.0  49.142857\n2015-01-10  MAX  42.0  49.285714\n
Run Code Online (Sandbox Code Playgroud)\n

min_15

\n
           TYPE     v    rolling\ndate                            \n2015-01-01  MIN  24.0        NaN\n2015-01-02  MIN  26.0        NaN\n2015-01-03  MIN  35.0        NaN\n2015-01-04  MIN  38.0        NaN\n2015-01-05  MIN  42.0        NaN\n2015-01-06  MIN  38.0        NaN\n2015-01-07  MIN  34.0  33.857143\n2015-01-08  MIN  35.0  35.428571\n2015-01-09  MIN  37.0  37.000000\n2015-01-10  MIN  36.0  37.142857\n
Run Code Online (Sandbox Code Playgroud)\n