上一篇介绍了pandas的DataFrame对象直接调用plot方法绘制折线图,这篇进一步介绍几个matplotlib功能。
背景
现有一个名为df的DataFrame如下
BTD | 准确率 | 识别率 | 调和均值 |
---|---|---|---|
0 | 0.304476 | 0.201810 | 0.223464 |
-1 | 0.289745 | 0.354814 | 0.303968 |
-2 | 0.263408 | 0.486673 | 0.333140 |
-3 | 0.238598 | 0.578130 | 0.332368 |
-4 | 0.218052 | 0.643336 | 0.322014 |
-5 | 0.201183 | 0.694310 | 0.309317 |
通过如下代码
ax = df.plot()
ax.set_xlabel('BTD_WV-IR11(K)', fontsize=15)
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
绘制出
需求
- 图例显示出中文
- 横坐标标签中
WV-IR11
为下标 - 横纵坐标末端有箭头
- 纵坐标刻度用百分比表示
- 绘制
x=-2
的虚线 - 图例的外边框不显示
实现
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
from matplotlib.ticker import FuncFormatter
from mpl_toolkits import axisartist
fig = plt.figure()
ax = axisartist.Subplot(fig, 111)
fig.add_subplot(ax)
ax.plot(df)
# 横坐标标签中`WV-IR11`为下标
ax.set_xlabel(r'$BTD_{WV-IR11}$(K)') # fontdict和fontsize不起作用,要通过下一行调整字号
ax.axis['bottom'].label.set_size(20)
# 图例显示出中文
font = FontProperties(size=15, fname=r'C:\Windows\Fonts\simsun.ttc')
ax.legend(['准确率', '识别率', '调和均值'], prop=font, frameon=False) # 指定prop后fontsize参数失效
# 纵坐标刻度用百分比表示
def to_percent(temp, position):
return f'{100*temp:.2f}%'
ax.yaxis.set_major_formatter(FuncFormatter(to_percent))
# 绘制x=-2的虚线
ax.axvline(-2, color='red', linestyle ='--')
# 绘制坐标轴箭头
ax.axis['bottom'].set_axisline_style('->')
ax.axis['left'].set_axisline_style('->')
# 不显示上边框和右边框
ax.axis['top'].set_visible(False)
ax.axis['right'].set_visible(False)
出图为:
基本实现了目标,但图片分辨率不高,坐标轴的箭头似乎有点歪,图例位置也不太满意,留坑。
吐槽
因为想要坐标轴的箭头,默认的axes没有这个功能,所以使用的ax是由axisartist创建的,这也导致字号的设置方法、上边框和右边框关闭方法和默认的axes不同,这让我一度摸不着头脑,作为业余写代码的觉得这么搞不是很合理,更别说优雅了。
我尝试了Julia
的Plots
,根据官方文档要实现同样的需求代码就非常优雅,但是现在还没真正开发完成,比如画坐标轴箭头的参数存在,但目前仅仅是个占位符还没有真正支持。
不得不说,同为开源软件,Python的matplotlib强大,但有点“臃肿”,让人觉得是各种功能一点一点堆积出来的,而Julia作为为科学计算而生的语言,处理数据方面非常的优雅,但目前还没有发育成熟。
愿开源世界繁荣昌盛~
本期填坑:
- 显示中文
未填坑和新坑:
- 图片保存格式
- 显示和保存的dpi与字号关系
- 图例位置
- julia