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获取当前时间的方法
Jan 14 Python
Python ORM框架SQLAlchemy学习笔记之关系映射实例
Jun 10 Python
K-means聚类算法介绍与利用python实现的代码示例
Nov 13 Python
在python下读取并展示raw格式的图片实例
Jan 24 Python
Python递归函数 二分查找算法实现解析
Aug 12 Python
基于Python解密仿射密码
Oct 21 Python
numpy.transpose()实现数组的转置例子
Dec 02 Python
python重要函数eval多种用法解析
Jan 14 Python
pycharm工具连接mysql数据库失败问题
Apr 01 Python
python 利用matplotlib在3D空间中绘制平面的案例
Feb 06 Python
使用pandas或numpy处理数据中的空值(np.isnan()/pd.isnull())
May 14 Python
详解Python如何批量采集京东商品数据流程
Jan 22 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
PHP 字符串分割和比较
2009/10/06 PHP
深入解析PHP垃圾回收机制对内存泄露的处理
2013/06/14 PHP
Yii2.0多文件上传实例说明
2017/07/24 PHP
详细解读php的命名空间(二)
2018/02/21 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
2019/11/19 PHP
比较简单的异步加载JS文件的代码
2009/07/18 Javascript
超越Jquery_01_isPlainObject分析与重构
2010/10/20 Javascript
实用的Jquery选项卡TAB示例代码
2013/08/28 Javascript
vue源码入口文件分析(推荐)
2018/01/30 Javascript
解决vuejs 使用value in list 循环遍历数组出现警告的问题
2018/09/26 Javascript
javascript数组常见操作方法实例总结【连接、添加、删除、去重、排序等】
2019/06/13 Javascript
基于Express框架使用POST传递Form数据
2019/08/10 Javascript
python socket 超时设置 errno 10054
2014/07/01 Python
低版本中Python除法运算小技巧
2015/04/05 Python
对pandas读取中文unicode的csv和添加行标题的方法详解
2018/12/12 Python
对python生成业务报表的实例详解
2019/02/03 Python
Python3标准库总结
2019/02/19 Python
pygame库实现俄罗斯方块小游戏
2019/10/29 Python
Python threading模块condition原理及运行流程详解
2020/10/05 Python
BIBLOO捷克:购买女装、男装、童装、鞋和配件
2017/01/27 全球购物
您在慕尼黑的跑步商店:Lauf-bar
2019/10/11 全球购物
党员培训思想汇报
2014/01/07 职场文书
聊城大学毕业生自荐书
2014/02/01 职场文书
报关专员求职信范文
2014/02/22 职场文书
节能环保口号
2014/06/12 职场文书
公司活动总结范文
2014/07/01 职场文书
微笑面对生活演讲稿
2014/09/23 职场文书
2014年数学教研组工作总结
2014/12/06 职场文书
优秀班主任主要事迹材料
2014/12/16 职场文书
小班下学期幼儿评语
2014/12/30 职场文书
婚礼伴郎致辞
2015/07/28 职场文书
nginx proxy_cache 缓存配置详解
2021/03/31 Servers
详解MySQL事务的隔离级别与MVCC
2021/04/22 MySQL
试了下Golang实现try catch的方法
2021/07/01 Golang
Python+OpenCV实现图片中的圆形检测
2022/04/07 Python
安装Ruby和 Rails的详细步骤
2022/04/19 Ruby