问题
发现一个奇怪的问题,记录一下:
用 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()
输出结果如下:
参考阅读:
-
https://segmentfault.com/a/1190000006158803?utm_source=tag-newest#articleHeader9
Matplotlib绘图双纵坐标轴设置及控制设置时间格式 -
https://blog.youkuaiyun.com/henbile/article/details/79964235 python
matplotlib 柱状图x轴xsticks固定顺序(升序、降序)