Python3.matplotlib绘图琢磨02

上一篇介绍了pandas的DataFrame对象直接调用plot方法绘制折线图,这篇进一步介绍几个matplotlib功能。

背景

现有一个名为df的DataFrame如下

BTD准确率识别率调和均值
00.3044760.2018100.223464
-10.2897450.3548140.303968
-20.2634080.4866730.333140
-30.2385980.5781300.332368
-40.2180520.6433360.322014
-50.2011830.6943100.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作为为科学计算而生的语言,处理数据方面非常的优雅,但目前还没有发育成熟。

愿开源世界繁荣昌盛~


本期填坑:

  • 显示中文

未填坑和新坑:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值