Python 3.x Matplotlib图表在X轴上没有正确对齐

Python 3.x Matplotlib图表在X轴上没有正确对齐,python-3.x,pandas,matplotlib,Python 3.x,Pandas,Matplotlib,我有以下代码: import pandas as pd from pandas import datetime from pandas import DataFrame as df import matplotlib from pandas_datareader import data as web import matplotlib.pyplot as plt import datetime start = datetime.date(2015,1,1) end = datetime.dat

我有以下代码:

import pandas as pd
from pandas import datetime
from pandas import DataFrame as df
import matplotlib
from pandas_datareader import data as web
import matplotlib.pyplot as plt
import datetime

start = datetime.date(2015,1,1)
end = datetime.date.today()
start1 = datetime.date(2019,1,1)

data = web.DataReader("^GSPC", 'yahoo',start, end)
data1 = web.DataReader("^GSPC", 'yahoo', start1, end)


data.set_index('month',append=True,inplace=True)
data1.set_index('month',append=True,inplace=True)
data1['pct_day']= data1['Adj Close'].pct_change()

df = data.groupby(['month', 'day']).mean()
df2['cumsum_pct_day']=df2['pct_day'].cumsum(axis = 0)

ax = df.plot(y='cumsum_pct_day', grid = True)
df2.plot(y='cumsum_pct_day', grid= True)
此代码生成以下图表

ax = df.plot(y='cumsum_pct_day', grid = True, legend =False)
df2.plot(y='cumsum_pct_day', grid= True, legend = False, ax=ax)
我在最后一行添加了
ax=ax
。结果图如下所示

请注意,x轴上的部分编号缺失,橙色线图(这是我试图覆盖的第二个图)也不正确,因为我们现在是第11个月,因此它应该一直绘制到图的末尾。当我分别绘制它们时,它似乎绘制正确。我能做些什么来解决这个问题


测向数据:

High    Low Open    Close   Volume  Adj Close   year    pct_day cumsum_pct_day
month   day                                 
1   2   2429.246663 2398.623372 2406.529948 2421.346680 3.269703e+09    2421.346680 2017.333333 0.003077    0.003077
3   2490.463298 2462.286621 2480.446696 2472.926676 3.710683e+09    2472.926676 2018.000000 -0.003290   -0.000213
4   2394.595032 2361.170074 2373.360046 2384.834991 3.994610e+09    2384.834991 2017.500000 0.007196    0.006983
5   2272.832458 2252.469971 2266.932495 2262.359955 3.626045e+09    2262.359955 2016.500000 -0.002501   0.004482
6   2108.020020 2078.516683 2101.666626 2089.949992 4.045553e+09    2089.949992 2016.000000 -0.006164   -0.001682
... ... ... ... ... ... ... ... ... ... ...
12  27  2482.853353 2447.666585 2463.610026 2480.110026 2.761923e+09    2480.110026 2017.000000 0.003867    0.139297
28  2384.252502 2362.222473 2378.217529 2369.924988 2.685205e+09    2369.924988 2016.500000 -0.002486   0.136811
29  2342.730062 2326.236735 2333.063314 2333.743408 2.440620e+09    2333.743408 2016.000000 0.001718    0.138529
30  2165.460083 2147.795044 2164.475098 2151.095093 2.519165e+09    2151.095093 2015.500000 -0.005927   0.132602
31  2219.120036 2194.793335 2213.880046 2203.229980 2.901423e+09    2203.229980 2015.666667 -0.000460   0.132142
363 rows × 9 columns
df2数据:

High    Low Open    Close   Volume  Adj Close   year    pct_day cumsum_pct_day
month   day                                 
1   2   2519.489990 2467.469971 2476.959961 2510.030029 3733160000  2510.030029 2019    0.001268    0.001268
3   2493.139893 2443.959961 2491.919922 2447.889893 3822860000  2447.889893 2019    -0.024757   -0.023488
4   2538.070068 2474.330078 2474.330078 2531.939941 4213410000  2531.939941 2019    0.034336    0.010847
7   2566.159912 2524.560059 2535.610107 2549.689941 4104710000  2549.689941 2019    0.007010    0.017858
8   2579.820068 2547.560059 2568.110107 2574.409912 4083030000  2574.409912 2019    0.009695    0.027553
... ... ... ... ... ... ... ... ... ... ...
11  13  3098.060059 3078.800049 3084.179932 3094.040039 3509280000  3094.040039 2019    0.000712    0.218003
14  3098.199951 3083.260010 3090.750000 3096.629883 3276070000  3096.629883 2019    0.000837    0.218840
15  3120.459961 3104.600098 3107.919922 3120.459961 3335650000  3120.459961 2019    0.007695    0.226536
18  3121.479980 3112.060059 3117.909912 3120.199951 804057034   3120.199951 2019    -0.000083   0.226452
12  31  2509.239990 2482.820068 2498.939941 2506.850098 3442870000  2506.850098 2018    NaN NaN
224 rows × 9 columns
使用子图修复此问题:我们创建一个Axis对象(ax)。请注意,我们将ax传递给两个绘图

fig, ax = plt.subplots()

df.plot(y='cumsum_pct_day', grid = True, legend =False, ax=ax)
df2.plot(y='cumsum_pct_day', grid= True, legend = False, ax=ax)

问题是两个数据集中缺少的日期不同。您可以通过在开始时“填充”缺失的日期来解决此问题。这是通过以下方式完成的:

#创建包含所有日期的索引
完整日期=pd.日期范围(开始、结束)
#用NaN值填充缺少的日期
data=data.reindex(完整日期)
检查
pd.reindex()
的文档以填写其他值。 既然两个数据集都有相同的日期,您可以将它们绘制在一起

作为奖励,我在代码末尾添加了几行,以便在水平轴上有更多有意义的记号

完整代码:

将熊猫作为pd导入
从导入日期时间
从中导入数据帧作为df
导入matplotlib
从pandas_datareader以web形式导入数据
将matplotlib.pyplot作为plt导入
导入日期时间
将numpy作为np导入
开始=日期时间。日期(2015,1,1)
end=datetime.date.today()
start1=日期时间。日期(2019,1,1)
data=web.DataReader(“^GSPC”,“yahoo”,开始,结束)
data1=web.DataReader(“^GSPC”,“yahoo”,开始,结束)
data.index=pd.to\u datetime(data.index,格式=“%Y-%m-%d”)
data1.index=pd.to\u datetime(data1.index,格式=“%Y-%m-%d”)
#这里有3行新行来填充日期
完整日期=pd.日期范围(开始、结束)
data=data.reindex(完整日期)
data1=data1.reindex(完整日期)
数据['year']=data.index.year
数据['month']=data.index.month
数据['week']=data.index.week
数据['day']=data.index.day
数据1['year']=data1.index.year
data1['month']=data1.index.month
data1['week']=data1.index.week
数据1['day']=data1.index.day
data.set_索引('month',append=True,inplace=True)
data1.set_索引('month',append=True,inplace=True)
data.set_索引('week',append=True,inplace=True)
data1.set_索引('week',append=True,inplace=True)
data.set_索引('day',append=True,inplace=True)
data1.set_索引('day',append=True,inplace=True)
数据['pct_day']=数据['Adj Close'].pct_变更()
data1['pct_day']=data1['Adj Close'].pct_change()
df=data.groupby(['month','day']).mean()
df2=data1.groupby(['month','day']).mean()
df['cumsum\u pct\u day']=df['pct\u day'].cumsum(axis=0)
df2['cumsum\u pct\u day']=df2['pct\u day']。cumsum(轴=0)
ax=df.plot(y='cumsum\u pct\u day',grid=True,label='df')
df2.plot(y='cumsum\u pct\u day',grid=True,ax=ax,label='df2')
#奖励:更有意义的滴答声
firsts=pd.date#u范围(起始日期为2019年1月1日,期间为12,频率为M')#月份第一天的日期
n_天=列表(月内的第一天)#月内的天数
n_天=[0]+n_天[:-1]
ticks=np.cumsum(n#天)#每月第一天的指数
滴答声日期=完整日期[滴答声]
ticklabels=[date.strftime(“%m-%d”)表示刻度日期中的日期]
ax.set_xticks(刻度)
ax.set_xticklabels(滴答声标签,旋转=45)
plt.show()

我们无法测试您的代码,因为它不完整。但是,您可能希望查看此示例并共享您的x轴,即从上次绘图例程中的
ax=ax
sharex=ax
这是完整的代码!实际上,你的一个图只有(10,17)的值,没有进一步的数据。因此,在叠加的图表上,期望他们两人都能坚持到最后是不合理的,因为没有足够的数据。@虽然df2的数据一直持续到第11个月。谢谢,图表没有改变。我知道你做了什么,但图表和我做的一样
ax=df.plot(y='cumsum\u pct\u day',grid=True,legend=False)
谢谢主持人,你帮了我大忙,我真的很挣扎!
fig, ax = plt.subplots()

df.plot(y='cumsum_pct_day', grid = True, legend =False, ax=ax)
df2.plot(y='cumsum_pct_day', grid= True, legend = False, ax=ax)