您的位置:首页 > 编程语言 > Python开发

解决 Python Matplotlib 绘图时不连续x轴自动补全的问题(xsticks)

2019-07-06 13:14 796 查看

问题

发现一个奇怪的问题,记录一下:

用 Python Matplotlib绘图的时候,x轴为不连续的日期,但是画出来的图,对于不连续的部分x轴会自动补全,空出来的部分是没有值的。(x轴数据明明是明确给定的,不知道为什么会自动补全,是不是有参数可以控制?希望有大神可以指导,感谢~)

具体如下:

#输入数据
date = [20190601,20190602,20190603,20190605,20190606,20190607,20190608, 20190609,20190611,20190612]
close = [34.35, 34.5, 34.89, 34.22, 33.54, 34.56, 32.14, 33.81, 31.03, 34.01]
changerate = [1.02, 0.98, 1.1, -0.88, -2.3, 1.5, -7.8, 5.67, 4.56, 9.78]
#绘图
from matplotlib.pylab import mpl
mpl.rcParams['font.sans-serif'] = ['FangSong']
mpl.rcParams['axes.unicode_minus'] = False

import matplotlib.pyplot as plt
fig = plt.figure(figsize=(8,6))

ax1 = fig.add_subplot(2,1,1)
ax1.bar(date, close, label='收盘价')
ax1.legend(loc='upper right')
ax1.set_xlabel('交易日')
ax1.set_ylabel('收盘价')
ax1.set_title('收盘价柱状图')

ax2 = fig.add_subplot(2,1,2)
ax2.plot(date, changerate, label='变化率', color = 'orange')
ax2.legend(loc='upper left')
ax2.set_xlabel('交易日')
ax2.set_ylabel('收盘价变化率')
ax2.set_title('收盘变化率折线图')

plt.tight_layout()
plt.show()

输出结果如下图:


在这里,我的x轴数据date不是连续的,没有20190604和0190610,但是画出来的图,却自动把缺的这两天给补上了,感觉好奇怪,在这里这并不是我想要的效果(不过有时候正好也需要这种效果)。

尝试把date转化为日期型的date2,再进行绘图,结果也是一样的:

# convert int into date
import datetime
date2 = []
for tradedate in date:
real_date = datetime.datetime.strptime(
str(tradedate),"%Y%m%d")
date2.append(real_date)

如果把date改为普通的不连续的数列date3,也还是有这个问题:

date3 = [1,2,3,6,7,8,9,11,12,13]

解决方案

解决方法是用xsticks设置x轴格式:
对于柱形图,把

ax1.bar(date, close, label='收盘价')

改为:(两行顺序可交换)

plt.xticks(range(len(date)), date, rotation=30) #rotation表示x轴刻度旋转度数
ax1.bar(range(len(date)), close, label='收盘价')

对于条形图,把

ax2.plot(date, changerate, label='变化率', color = 'orange'

改为:(两行顺序可交换)

ax2.plot(changerate, label='变化率', color = 'orange')
plt.xticks(range(len(date)), date, rotation=30)

完整代码如下:

from matplotlib.pylab import mpl
mpl.rcParams['font.sans-serif'] = ['FangSong']
mpl.rcParams['axes.unicode_minus'] = False

import matplotlib.pyplot as plt
fig = plt.figure(figsize=(8,6))

ax1 = fig.add_subplot(2,1,1)
plt.xticks(range(len(date)), date, rotation=30)#rotation表示x轴刻度旋转度数
ax1.bar(range(len(date)), close, label='收盘价')
ax1.legend(loc='upper right')
ax1.set_xlabel('交易日')
ax1.set_ylabel('收盘价')
ax1.set_title('收盘价柱状图')

ax2 = fig.add_subplot(2,1,2)
ax2.plot(changerate, label='变化率', color = 'orange')
plt.xticks(range(len(date)), date, rotation=30)
ax2.legend(loc='upper left')
ax2.set_xlabel('交易日')
ax2.set_ylabel('收盘价变化率')
ax2.set_title('收盘变化率折线图')

plt.tight_layout()
plt.show()

输出结果如下:

参考阅读:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: