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 轴为摄氏度
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\nmax_15
和min_15
,它们是 2015 年俄勒冈州波特兰市的最低和最高温度。\ndate
使用 转换为日期时间格式pd.to_datetime
,然后设置为索引。v
是一列浮点数MIN
&MAX
值分离到单独的数据帧中,这也在下面的数据清理中显示。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\nimport 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)\nmax_15
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)\nmin_15
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