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中的reduce内建函数使用方法指南
Aug 31 Python
python二分查找算法的递归实现方法
May 12 Python
Python 获取当前所在目录的方法详解
Aug 02 Python
基于python中pygame模块的Linux下安装过程(详解)
Nov 09 Python
Python实现的根据文件名查找数据文件功能示例
May 02 Python
Python实现的查询mysql数据库并通过邮件发送信息功能
May 17 Python
python组合无重复三位数的实例
Nov 13 Python
Django Rest framework之权限的实现示例
Dec 17 Python
Scrapy-Redis结合POST请求获取数据的方法示例
May 07 Python
python实现图片上添加图片
Nov 26 Python
pandas实现将日期转换成timestamp
Dec 07 Python
通过代码实例了解Python异常本质
Sep 16 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
SMARTY学习手记
2007/01/04 PHP
php中json_decode()和json_encode()的使用方法
2012/06/04 PHP
PHP UTF8中文字符截断函数代码
2012/09/11 PHP
php编程中echo用逗号和用点号连接的区别
2016/03/26 PHP
php json中文编码为null的解决办法
2016/12/14 PHP
JavaScript高级程序设计 读书笔记之九 本地对象Array
2012/02/27 Javascript
关于jQuery对象数据缓存Cache原理以及jQuery.data详解
2013/04/07 Javascript
Javascript 运动中Offset的bug解决方案
2014/12/24 Javascript
JavaScript中检查对象property的存在性方法介绍
2014/12/30 Javascript
JS模拟酷狗音乐播放器收缩折叠关闭效果代码
2015/10/29 Javascript
jQuery下拉框的简单应用
2016/06/24 Javascript
浅述Javascript的外部对象
2016/12/07 Javascript
vue router路由嵌套不显示问题的解决方法
2017/06/17 Javascript
微信小程序实现星星评价效果
2018/11/02 Javascript
vue+element 模态框表格形式的可编辑表单实现
2019/06/07 Javascript
vue实现输入框的模糊查询的示例代码(节流函数的应用场景)
2019/09/01 Javascript
js+css3实现简单时钟特效
2020/09/13 Javascript
对于Python装饰器使用的一些建议
2015/06/03 Python
Python出现segfault错误解决方法
2016/04/16 Python
Python第三方库的安装方法总结
2016/06/06 Python
Python的面向对象编程方式学习笔记
2016/07/12 Python
Python 中迭代器与生成器实例详解
2017/03/29 Python
Python编程实现从字典中提取子集的方法分析
2018/02/09 Python
python实现音乐下载的统计
2018/06/20 Python
解决python2 绘图title,xlabel,ylabel出现中文乱码的问题
2019/01/29 Python
python之pexpect实现自动交互的例子
2019/07/25 Python
英国最大的奢侈珠宝和手表网站:C W Sellors
2017/02/10 全球购物
UML设计模式笔试题
2014/06/07 面试题
建材业务员岗位职责
2013/12/08 职场文书
求职信范文怎么写
2014/01/29 职场文书
爱心倡议书范文
2014/05/12 职场文书
加强干部作风建设整改方案
2014/10/24 职场文书
详解nginx.conf 中 root 目录设置问题
2021/04/01 Servers
mapstruct的用法之qualifiedByName示例详解
2022/04/06 Java/Android
Redis入门基础常用操作命令整理
2022/06/01 Redis
Android中的Launch Mode详情
2022/06/05 Java/Android