Python3.matplotlib绘图琢磨02

上一篇介绍了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不同,这让我一度摸不着头脑,作为业余写代码的觉得这么搞不是很合理,更别说优雅了。

我尝试了JuliaPlots,根据官方文档要实现同样的需求代码就非常优雅,但是现在还没真正开发完成,比如画坐标轴箭头的参数存在,但目前仅仅是个占位符还没有真正支持。

不得不说,同为开源软件,Python的matplotlib强大,但有点“臃肿”,让人觉得是各种功能一点一点堆积出来的,而Julia作为为科学计算而生的语言,处理数据方面非常的优雅,但目前还没有发育成熟。

扫描二维码关注公众号,回复: 11944688 查看本文章

愿开源世界繁荣昌盛~


本期填坑:

  • 显示中文

未填坑和新坑:

  • 图片保存格式
  • 显示和保存的dpi与字号关系
  • 图例位置
  • julia

猜你喜欢

转载自blog.csdn.net/modabao/article/details/105878653
今日推荐