我正在画一张股票市场的图表
时间序列对收盘价和时间序列对成交量。
X轴显示的是1970年的时间
下面是图表和代码
代码为:
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
pd_data = pd.DataFrame(data, columns=['id', 'symbol', 'volume', 'high', 'low', 'open', 'datetime','close','datetime_utc','created_at'])
pd_data['DOB'] = pd.to_datetime(pd_data['datetime_utc']).dt.strftime('%Y-%m-%d')
pd_data.set_index('DOB')
print(pd_data)
print(pd_data.dtypes)
ax=pd_data.plot(x='DOB',y='close',kind = 'line')
ax.set_ylabel("price")
#ax.pd_data['volume'].plot(secondary_y=True, kind='bar')
ax1=pd_data.plot(y='volume',secondary_y=True, ax=ax,kind='bar')
ax1.set_ylabel('Volumne')
# Choose your xtick format string
date_fmt = '%d-%m-%y'
date_formatter = mdates.DateFormatter(date_fmt)
ax1.xaxis.set_major_formatter(date_formatter)
# set monthly locator
ax1.xaxis.set_major_locator(mdates.MonthLocator(interval=1))
# set font and rotation for date tick labels
plt.gcf().autofmt_xdate()
plt.show()
还在不使用ax=ax
的情况下单独尝试了两个图表
ax=pd_data.plot(x='DOB',y='close',kind = 'line')
ax.set_ylabel("price")
ax1=pd_data.plot(y='volume',secondary_y=True,kind='bar')
ax1.set_ylabel('Volumne')
价格图显示年份,而成交量图显示1970年
如果我把它们换了
ax1=pd_data.plot(y='volume',secondary_y=True,kind='bar')
ax1.set_ylabel('Volumne')
ax=pd_data.plot(x='DOB',y='close',kind = 'line')
ax.set_ylabel("price")
现在,成交量图正确显示年份,而价格图显示的年份为1970年
我试着删除secondary_y,并将bar更改为line,但没有成功
不知何故,Pandas第一张图表之后的数据正在改变年份。
2条答案
按热度按时间a0zr77ik1#
pandas.DataFrame.plot
进行打印不会出现问题*在
python 3.8.11
、pandas 1.3.2
、matplotlib 3.4.2
中测试*本answer的解决方案2展示了如何更改刻度定位器,但在可以使用
plt.bar
时,确实不值得额外编写代码。x一个一个一个一个x一个一个二个x
plt.bar
,条形图位置基于日期时间进行索引sns.barplot(x=df.index, y=df.Volume, ax=ax1)
的xtick
位置与[ 0 1 2 ... 1553 1554 1555]
相同,因此条形图和折线图未对齐。wwtsj6pe2#
我找不到1970年的原因,而是使用matplotlib.pyplot绘图,而不是间接使用panda,并且传递datatime数组,而不是panda
所以下面的代码是有效的
我创建了一个日期时间格式的日期数组。如果我用它制作图表,那么日期就不会显示为1970年
我得到的情节是