matplotlib源码解析标题实现(窗口标题,标题,子图标题不同之间的差异)


Posted in Python onFebruary 22, 2021

matplotlib中常用的标题主要三种:窗口标题、图像标题和子图标题。
先通过三个案例简要说明这三类标题的实现。

窗口标题、图像标题,子图标题(仅1个子图)

matplotlib源码解析标题实现(窗口标题,标题,子图标题不同之间的差异)

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = 'SimHei'

fig = plt.figure()
plt.plot([1, 2])
# 设置图像标题
plt.suptitle("这是图像标题")
# 设置子图标题
plt.title("这是子图标题")
# 获取默认窗口标题
current_title = fig.canvas.manager.window.windowTitle()
print("默认窗口:",current_title)
# 设置窗口标题方式一
fig.canvas.set_window_title("这是窗口标题")
# 设置窗口标题方式二
fig.canvas.manager.window.setWindowTitle("这是窗口标题")

plt.show()

窗口标题、图像标题、子图标题(多子图)

使用subplot函数实现子图

matplotlib源码解析标题实现(窗口标题,标题,子图标题不同之间的差异)

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = 'SimHei'

fig = plt.figure()
plt.subplot(1, 2, 1)
plt.plot([1,2,3,4], [1,4,9,16], "go") 
# 设置子图1标题
plt.title("子图1标题")

plt.subplot(122)
plt.plot([1,2,3,4], [1,4,9,16], "r^") # r^ 表示 红色(red)三角
# 设置子图2标题
plt.title("子图2标题")
# 设置图像标题
plt.suptitle("图像标题")
# 设置窗口标题
#fig.canvas.set_window_title("这是窗口标题")
fig.canvas.manager.window.setWindowTitle("这是窗口标题")

plt.show()

使用subplots函数subplots实现子图

matplotlib源码解析标题实现(窗口标题,标题,子图标题不同之间的差异)

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = 'SimHei'

fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(6,6))
ax[0].plot([1,2,3,4], [1,4,9,16], "go") 
# 设置子图1标题
ax[0].set_title("子图1标题") 
ax[1].plot([1,2,3,4], [1,4,9,16], "r^") 
# 设置子图2标题
ax[1].set_title("子图2标题") 
# 设置图像标题
plt.suptitle("图像标题")
# 设置窗口标题
fig.canvas.manager.window.setWindowTitle("这是窗口标题")

plt.show()

原理分析

通过前面三个案例可知:

窗口标题

设置窗口标题可以用两种方法:
一种是调用figure.canvas对象的set_window_title方法,一种是figure.canvas.manager.window对象的setWindowTitle方法。通过下面源码可知,这两种方法其实是等价的。
因此在日常实现过程中,关键是获取当前图像对象(figure),即案例中的fig。该方法只有一个参数,类型为字符串。
可以通过

通过figure.canvas.manager.window对象的windowTitle方法可以获取窗口标题。

class FigureManagerQT(FigureManagerBase):
  def set_window_title(self, title):
    self.window.setWindowTitle(title)

图像标题

调用plt.suptitle函数即可。根据源码可知,plt.suptitle函数其实是调用了当前figure对象的suptitle方法。

suptitle函数参数

def suptitle(self, t, **kwargs):
    """
    Add a centered title to the figure.

    Parameters
    ----------
    t : str
      The title text.

    x : float, default 0.5
      The x location of the text in figure coordinates.

    y : float, default 0.98
      The y location of the text in figure coordinates.

    horizontalalignment, ha : {'center', 'left', right'}, default: 'center'
      The horizontal alignment of the text relative to (*x*, *y*).

    verticalalignment, va : {'top', 'center', 'bottom', 'baseline'}, \
default: 'top'
      The vertical alignment of the text relative to (*x*, *y*).

    fontsize, size : default: :rc:`figure.titlesize`
      The font size of the text. See `.Text.set_size` for possible
      values.

    fontweight, weight : default: :rc:`figure.titleweight`
      The font weight of the text. See `.Text.set_weight` for possible
      values.

    Returns
    -------
    text
      The `.Text` instance of the title.

    Other Parameters
    ----------------
    fontproperties : None or dict, optional
      A dict of font properties. If *fontproperties* is given the
      default values for font size and weight are taken from the
      `.FontProperties` defaults. :rc:`figure.titlesize` and
      :rc:`figure.titleweight` are ignored in this case.

    **kwargs
      Additional kwargs are `matplotlib.text.Text` properties.

    Examples
    --------
    >>> fig.suptitle('This is the figure title', fontsize=12)
    """

子图标题

  • 使用subplot函数:在所在子图中,使用plt.title函数。
  • 使用subplots函数:使用子图对象调用set_title方法。
  • plt.title函数和axes.set_title方法的参数相同。

注意,在使用subplots函数创建子图时,为什么不能使用plt.title函数设置子图标题呢?
根据title函数的源码可知,title函数其实是通过gca()函数获取子图,然后再调用set_title方法设置标题的。根据实验,在使用subplots函数函数创建多个子图时,plt.gca()只能得到最后一个子图的标题,因此,在某些情况下使用plt.title函数可设置最后一个子图的标题。

plt.title函数和axes.set_title方法源码

def title(label, fontdict=None, loc=None, pad=None, *, y=None, **kwargs):
  return gca().set_title(
    label, fontdict=fontdict, loc=loc, pad=pad, y=y, **kwargs)
Axes.set_title(self, label, fontdict=None, loc=None, pad=None, *, y=None, **kwargs):
  """
  Set a title for the axes.

  Set one of the three available axes titles. The available titles
  are positioned above the axes in the center, flush with the left
  edge, and flush with the right edge.

  Parameters
  ----------
  label : str
    Text to use for the title

  fontdict : dict
    A dictionary controlling the appearance of the title text,
    the default *fontdict* is::

      {'fontsize': rcParams['axes.titlesize'],
      'fontweight': rcParams['axes.titleweight'],
      'color': rcParams['axes.titlecolor'],
      'verticalalignment': 'baseline',
      'horizontalalignment': loc}

  loc : {'center', 'left', 'right'}, default: :rc:`axes.titlelocation`
    Which title to set.

  y : float, default: :rc:`axes.titley`
    Vertical axes loation for the title (1.0 is the top). If
    None (the default), y is determined automatically to avoid
    decorators on the axes.

  pad : float, default: :rc:`axes.titlepad`
    The offset of the title from the top of the axes, in points.

  Returns
  -------
  `.Text`
    The matplotlib text instance representing the title

  Other Parameters
  ----------------
  **kwargs : `.Text` properties
    Other keyword arguments are text properties, see `.Text` for a list
    of valid text properties.
  """

plt.gca()实验

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = 'SimHei'

fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(6,6))
ax[0].plot([1,2,3,4], [1,4,9,16], "go") 
ax[1].plot([1,2,3,4], [1,4,9,16], "r^") 

print(plt.gca())
print(ax[0],ax[1])

结果为

AxesSubplot(0.547727,0.11;0.352273x0.77)
AxesSubplot(0.125,0.11;0.352273x0.77) AxesSubplot(0.547727,0.11;0.352273x0.77)

到此这篇关于matplotlib源码解析标题实现(窗口标题,标题,子图标题不同之间的差异)的文章就介绍到这了,更多相关matplotlib 标题内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python抓取最新博客内容并生成Rss
May 17 Python
在Django中进行用户注册和邮箱验证的方法
May 09 Python
Python实现查找二叉搜索树第k大的节点功能示例
Jan 24 Python
wxPython实现分隔窗口
Nov 19 Python
python实现视频读取和转化图片
Dec 10 Python
在PyCharm中实现添加快捷模块
Feb 12 Python
Python 给下载文件显示进度条和下载时间的实现
Apr 02 Python
Numpy中np.random.rand()和np.random.randn() 用法和区别详解
Oct 23 Python
pycharm永久激活超详细教程
Oct 29 Python
pytorch 计算Parameter和FLOP的操作
Mar 04 Python
python内置进制转换函数的操作
Jun 02 Python
python运算符之与用户交互
Apr 13 Python
python利用后缀表达式实现计算器功能
Feb 22 #Python
Python使用tkinter实现小时钟效果
Feb 22 #Python
Python tkinter实现日期选择器
Feb 22 #Python
Pyside2中嵌入Matplotlib的绘图的实现
Feb 22 #Python
Python实现Excel自动分组合并单元格
Feb 22 #Python
matplotlib绘制正余弦曲线图的实现
Feb 22 #Python
Python使用tkinter制作在线翻译软件
Feb 22 #Python
You might like
基于OpenCV的PHP图像人脸识别技术
2009/10/11 PHP
linux下删除7天前日志的代码(php+shell)
2011/01/02 PHP
PHP区块查询实现方法分析
2018/05/12 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
2019/11/24 PHP
javascript 表单的友好用户体现
2009/01/07 Javascript
JavaScript实现的图像模糊算法代码分享
2014/04/22 Javascript
用原生js做个简单的滑动效果的回到顶部
2014/10/15 Javascript
js中scrollTop()方法和scroll()方法用法示例
2016/10/03 Javascript
NodeJS使用formidable实现文件上传
2016/10/27 NodeJs
浅谈angularjs $http提交数据探索
2017/01/20 Javascript
Vue.js -- 过滤器使用总结
2017/02/18 Javascript
JS库之Highlight.js的用法详解
2017/09/13 Javascript
JS基于设计模式中的单例模式(Singleton)实现封装对数据增删改查功能
2018/02/06 Javascript
解决在Bootstrap模糊框中使用WebUploader的问题
2018/03/22 Javascript
vue .sync修饰符的使用详解
2018/06/15 Javascript
微信小程序中使用自定义图标(阿里icon)的方法
2018/08/20 Javascript
Vue的props父传子的示例代码
2020/05/20 Javascript
使用JavaScript实现网页秒表功能(含开始、暂停、继续、重置功能)
2020/06/05 Javascript
在vue中使用Base64转码的案例
2020/08/07 Javascript
JavaScript基于SVG的图片切换效果实例代码
2020/12/15 Javascript
基于JavaScript实现轮播图效果
2021/01/02 Javascript
Python常用内置函数总结
2015/02/08 Python
Python极简代码实现杨辉三角示例代码
2016/11/15 Python
Pandas探索之高性能函数eval和query解析
2017/10/28 Python
解决pyinstaller打包发布后的exe文件打开控制台闪退的问题
2019/06/21 Python
django解决订单并发问题【推荐】
2019/07/31 Python
python实现数字炸弹游戏
2020/07/17 Python
详解基于python的图像Gabor变换及特征提取
2020/10/26 Python
Python爬虫模拟登陆哔哩哔哩(bilibili)并突破点选验证码功能
2020/12/21 Python
基于HTML5超酷摄像头(HTML5 webcam)拍照功能实现代码
2012/12/13 HTML / CSS
Auchan Direct波兰:欧尚在线杂货店
2016/10/19 全球购物
酒店优秀员工事迹材料
2014/06/02 职场文书
运动会报道稿大全
2015/07/23 职场文书
煤矿安全生产管理协议书
2016/03/22 职场文书
python中的mysql数据库LIKE操作符详解
2021/07/01 MySQL
Python使用Beautiful Soup(BS4)库解析HTML和XML
2022/06/05 Python