前言

matplotlib 功能十分强大,就是工具栏丑了点。忍了一个学期之后,还是决定自己动手,魔改一波 matplotlib 的工具栏样式。同时给大家分享一下自己按照 MATLAB 写的 matplotlib 样式文件。注意:代码中 matplotlib 版本为 3.3.4,其他版本效果会不一样

工具栏的美化

matplotlib 工具栏有三种模式:Nonetoolbar2toolmanager,默认 toolbar2, 我们可以通过 plt.rcParams['toolbar'] 来更换模式。在 None 模式下,图窗中不存在工具栏;toolbar2toolmanager 长得很像,就是后者多了一个帮助按钮。先来看一下 matplotlib 工具栏本来的样子(后端使用的是Qt5Agg):

可以看到又黑又粗的图标搭配上灰色的背景,效果十分感人。上面也已经提到了,工具栏有三种模式,抛开 None 不看,如果我们想要修改工具栏的样式,就需要分别修改 toolbar2toolmanager 这两种模式下的样式。从 matplotlib.backends.backend_qt5 的第600行开始有:

def _get_toolbar(self, canvas, parent):
# must be inited after the window, drawingArea and figure
# attrs are set
if matplotlib.rcParams['toolbar'] == 'toolbar2':
toolbar = NavigationToolbar2QT(canvas, parent, True)
elif matplotlib.rcParams['toolbar'] == 'toolmanager':
toolbar = ToolbarQt(self.toolmanager, self.window)
else:
toolbar = None
return toolbar

从源码中可以得知两种模式下的工具栏分别是 NavigationToolbar2QTToolbarQt 的实例。既然是用 QT 写的,那要美化工具栏岂不是易如反掌?代码撸起来 []( ̄▽ ̄)*。分别在 NavigationToolbar2QTToolbarQt 的构造函数的最后一行加上:

self.setStyleSheet("""QToolBar{background:white}
QLabel{font:11pt 'Consolas'}""")

QToolBar{background:white} 设置工具栏的背景色为白色,QLabel{font:11pt 'Consolas'} 设置的工具栏的字体为 11pt 的 Consolas 。修改完层叠样式之后,我们来换一波图标,图标、字体以及mplstyle文件放在了百度网盘(提取码:nlnv),用这些图标替换掉 Lib\site-packages\matplotlib\mpl-data\images 中的自带图标,工具栏的美化就大功告成了( ̄︶ ̄) 。

绘图样式的美化

matplotlib 可以自定义绘图风格,这是它强大之处的体现。打开C盘用户文件夹的.matplotlib\stylelib,我们可以看到一些 .mplstyle 文件,这些文件就是某种绘图风格的具体配置。我们在这个目录下创建一个matlab.mplstye 文件,往里面写入:

## ***************************************************************************
## * AXES *
## ***************************************************************************
axes.grid : True
axes.axisbelow : True
axes.facecolor : white
axes.prop_cycle : cycler('color', ['0072BD', 'D95319', 'EDB120', '7E2F8E', '77AC30', '4DBEEE', 'A2142F']) ## ***************************************************************************
## * FIGURE *
## ***************************************************************************
figure.dpi : 140
figure.figsize : 8, 6 ## ***************************************************************************
## * TICKS *
## ***************************************************************************
xtick.direction : in
xtick.major.size : 6
xtick.major.width : 0.5
xtick.minor.size : 1.5
xtick.minor.width : 0.5
# xtick.minor.visible : True
xtick.top : True ytick.direction : in
ytick.major.size : 6
ytick.major.width : 0.5
ytick.minor.size : 1.5
ytick.minor.width : 0.5
# ytick.minor.visible : True
ytick.right : True ## ***************************************************************************
## * LINES *
## ***************************************************************************
axes.linewidth : 0.5
lines.linewidth : 1 ## ***************************************************************************
## * SAVING FIGURES *
## ***************************************************************************
savefig.dpi : 300
savefig.bbox : tight
savefig.pad_inches : 0.05 ## ***************************************************************************
## * FONT *
## ***************************************************************************
font.size : 11
font.family : serif
font.serif : Latin Modern Roman, Times New Roman
font.sans-serif : Helvetica
mathtext.default: it
mathtext.fallback: cm
mathtext.fontset : cm ## ***************************************************************************
## * GRIDS *
## ***************************************************************************
grid.color : 0.8
grid.alpha : 0.64
grid.linewidth : 0.5
grid.linestyle : - ## ***************************************************************************
## * LEGEND *
## ***************************************************************************
legend.loc: best
legend.shadow : False
legend.frameon : True
legend.fancybox : False
legend.numpoints : 1
legend.edgecolor: 0
legend.framealpha : 1

在绘图之前,调用一下 plt.style.use('matlab'),就可以将默认绘图风格换成上面定义的风格。

测试

import numpy as np
import matplotlib.pyplot as plt x = np.arange(0, 2 * np.pi, 0.01)
y = np.sin(x)
z = 0.5 * np.sin(x) # 更换工具栏模式
# plt.rcParams['toolbar'] = 'toolmanager'
# 设置绘图样式
plt.style.use('matlab') fig = plt.figure(num='sine wave') #type:plt.Figure
plt.plot(x, y, x, z)
plt.axis((0, 2 * np.pi, -1, 1)) plt.xlabel(r'$x$')
plt.ylabel(r'$y$')
plt.title(r'$Sine\ Wave$')
plt.legend([r'${\rm sin}(x)$', r'$0.5\cdot {\rm sin}(x)$'])
plt.show()

运行代码后效果如下:

可以看到图窗中的字体在数学模式下变成了好康的 Computer Modern,最重要的是工具栏也被成功美化。如果对工具栏不满意的话,可以自己改下 style sheet。以上*( •̀ ω •́ )✧

如何美化 Matplotlib 的工具栏和绘图风格的更多相关文章

  1. 4.12Python数据处理篇之Matplotlib系列(十二)---绘图风格的介绍

    目录 目录 前言 (一)不同风格 1.说明: 2.使用: 3.代码使用: (二)例子演示 1.dark_background 2.bmh 3.fivethirtyeight 4.ggplot 5.gr ...

  2. 如何美化 Matplotlib 3D坐标系

    前言 ~mpl_toolkits.mplot3d 生成的3D坐标系背景色是灰色的,刻度线也向内延伸了,如果搭配上其他白色背景的 2D 图,看起来很奇怪,比如下面这张图: 网上有一些办法可以将3D坐标区 ...

  3. 数据可视化基础专题(十):Matplotlib 基础(二) 自定义配置文件和绘图风格(rcParams和style)

    https://matplotlib.org/api/rcsetup_api.html#module-matplotlib.rcsetup 一.什么是rcParams?我们在使用matplotlibl ...

  4. 【python笔记】使用matplotlib,pylab进行python绘图

    一提到python绘图,matplotlib是不得不提的python最著名的绘图库,它里面包含了类似matlab的一整套绘图的API.因此,作为想要学习python绘图的童鞋们就得在自己的python ...

  5. python 利用matplotlib中imshow()函数绘图

    matplotlib 是python最著名的2D绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图.而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中.通过简单的绘图语 ...

  6. 使用 Python 的 matplotlib 绘图库进行绘图

    matplotlib 是 Python 最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地行制图.而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中. 1  使用 Ma ...

  7. 利用matplotlib中imshow()函数绘图

    matplotlib  是Python最著名的2D绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图.而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中.通过简单的绘图 ...

  8. scikit-learn:matplotlib.pyplot经常使用绘图功能总结(1)

    參考:http://matplotlib.org/api/pyplot_api.html 绘图功能总结(2):http://blog.csdn.net/mmc2015/article/details/ ...

  9. Liunx环境下配置matplotlib库使用中文绘图

    最近在使用matplotlib库的过程中需要用到中文绘图,在网上找了好多种方法,最终用一种方法解决了,在此记录. 首先Linux是有自己的中文字体的,叫做"Droid Sans Fallba ...

随机推荐

  1. BST的中序后继

    二叉搜索树中的顺序后继:从BST中找到指定节点的下一个节点. 比如1的下一个是2,2的下一个是3,4的下一个是5. 思路: 方法1:递归执行中序遍历,获取list,得到p的下一个.时间O(N),空间O ...

  2. Leapin' Lizards(hdu 2732)

    Leapin' Lizards Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  3. sql注入 —sqli-labs/Less-5 逻辑注入

    逻辑注入: 1.尝试查询数据库: (1)判断数据长度 -- 构造逻辑判断:and length(database())=8 当长度等于"8 "时回显正常,所以数据库长度为" ...

  4. TensorFlow.NET机器学习入门【4】采用神经网络处理分类问题

    上一篇文章我们介绍了通过神经网络来处理一个非线性回归的问题,这次我们将采用神经网络来处理一个多元分类的问题. 这次我们解决这样一个问题:输入一个人的身高和体重的数据,程序判断出这个人的身材状况,一共三 ...

  5. 一行代码完成定时任务调度,基于Quartz的UI可视化操作组件 GZY.Quartz.MUI

    前言 之前发布过第一个版本,有兴趣的可以去看看: NET Core 基于Quartz的UI可视化操作组件 GZY.Quartz.MUI 简介 GitHub开源地址:l2999019/GZY.Quart ...

  6. webservice websocket socket http rpc

    HTTP: HTTP 是基于请求响应式的,即通信只能由客户端发起,服务端做出响应,无状态,无连接. webSocket: 服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向 ...

  7. Zookeeper基础教程(三):Zookeeper连接使用—zkCli

    上一篇介绍Zookeeper的安装,并介绍了使用ZooInspector连接Zookeeper,这里主要介绍以命令行的形式介绍Zookeeper 假如我们已经安装了Zookeeper集群,集群中的安装 ...

  8. Pytest_测试用例的执行方式(2)

    在pytest框架中,编写测试用例有如下约束: 所有的测试用例文件名都需要满足test_*.py格式或*_test.py格式. 在测试用例文件中,测试类以Test开头,并且不能带有__init__方法 ...

  9. 使用springboot devtools工具实现热部署

    一.在maven父工程pom文件中添加依赖 二.在子工程中添加依赖 三.在IDEA中勾选 Build project automatically项 四. Shift+Ctrl+Alt+/,选择Regi ...

  10. spring security 动态 修改当前登录用户的 权限

    1.前言 spring security 可以获取当前登录的用户信息,同时提供了接口 来修改权限列表信息 , 使用这个方法 ,可以动态的修改当前登录用户权限. 那么问题来了... 如果我是管理员 ,如 ...