【Matplotlib04】文字图例尽眉目

2023-11-22 03:59

本文主要是介绍【Matplotlib04】文字图例尽眉目,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、前言

二、 Figure和Axes上的文本

2.1. 文本API示例

 2.2. text - 子图上的文本

2.3. xlabel和ylabel - 子图的x,y轴标签

2.4. title和suptitle - 子图和画布的标题

2.5. annotate - 子图的注解

 2.6. 字体的属性设置

 三、Tick上的文本

3.1.简单模式

 3.2 Tick Locators and Formatters

3.2.1 Tick Formatters(设置标签的格式)

3.2.2 Tick Locators(设置标签的位置)

 3.2.3 补充:日期型刻度(formatter和locator的结合使用)

 四、图例 legend

4.1设置图例位置

4.2  设置图例边框及背景

4.3 设置图例标题

 五、思考题

5.1请尝试使用两种方式模仿画出下面的图表(重点是柱状图上的标签),本文学习的text方法和matplotlib自带的柱状图标签方法bar_label


一、前言

第四回的内容主要是介绍figure和ax上的文字方法。

一个没有文字注释的图不是一个好图。-----沃自基朔德

二、 Figure和Axes上的文本

2.1. 文本API示例

pyplot API

OO API

description

text

text

在子图axes的任意位置添加文本

annotate

annotate

在子图axes的任意位置添加注解,包含指向性的箭头

xlabel

set_xlabel

为子图axes添加x轴标签

ylabel

set_ylabel

为子图axes添加y轴标签

title

set_title

为子图axes添加标题

figtext

text

在画布figure的任意位置添加文本

suptitle

suptitle

为画布figure添加标题

上面的命令是介绍了通过pyplot API和objected-oriented API分别创建文本的方式。

OO方式是面向对象的,可以对指定ax进行添加文本的操作,pyplot 只能对单个对象进行操作。

下面的代码是综合性的代码,看懂下面的代码就算掌握入门了。

fig = plt.figure()
ax = fig.add_subplot()# 分别为figure和ax设置标题,注意两者的位置是不同的
fig.suptitle('bold figure suptitle', fontsize=14, fontweight='bold')
ax.set_title('axes title')# 设置x和y轴标签
ax.set_xlabel('xlabel')
ax.set_ylabel('ylabel')# 设置x和y轴显示范围均为0到10
ax.axis([0, 10, 0, 10])# 在子图上添加文本
ax.text(3, 8, 'boxed italics text in data coords', style='italic',bbox={'facecolor': 'red', 'alpha': 0.5, 'pad': 10})# 在画布上添加文本,一般在子图上添加文本是更常见的操作,这种方法很少用
fig.text(0.4,0.8,'This is text for figure')ax.plot([2], [1], 'o')
# 添加注解
ax.annotate('annotate', xy=(2, 1), xytext=(3, 4),
arrowprops=dict(facecolor='black', shrink=0.05));

 2.2. text - 子图上的文本

text的调用方式为

Axes.text(x, y, s, fontdict=None, **kwargs)

参数说明:

  •         x,y为文本出现的位置,默认状态下即为当前坐标系下的坐标值,
  •    s为文本的内容,
  •    fontdict是可选参数,用于覆盖默认的文本属性,
  •    **kwargs为关键字参数,也可以用于传入文本样式参数

重点解释下fontdict和**kwargs参数,这两种方式都可以用于调整呈现的文本样式,最终效果是一样的,不仅text方法,其他文本方法如set_xlabel,set_title等同样适用这两种方式修改样式。通过一个例子演示这两种方法是如何使用的。

fig = plt.figure(figsize=(10,3))
axes = fig.subplots(1,2)# 使用关键字参数修改文本样式
axes[0].text(0.3, 0.8, 'modify by **kwargs', style='italic',bbox={'facecolor': 'red', 'alpha': 0.5, 'pad': 10});# 使用fontdict参数修改文本样式
font = {'bbox':{'facecolor': 'red', 'alpha': 0.5, 'pad': 10}, 'style':'italic'}
axes[1].text(0.3, 0.8, 'modify by fontdict', fontdict=font);

 

matplotlib中所有支持的样式参数请参考官网文档说明,大多数时候需要用到的时候再查询即可。

下表列举了一些常用的参数供参考。

Property

Description

alpha

float or None 透明度,越接近0越透明,越接近1越不透明

backgroundcolor

color 文本的背景颜色

bbox

dict with properties for patches.FancyBboxPatch 用来设置text周围的box外框

color or c

color 字体的颜色

fontfamily or family

{FONTNAME, 'serif', 'sans-serif', 'cursive', 'fantasy', 'monospace'} 字体的类型

fontsize or size

float or {'xx-small', 'x-small', 'small', 'medium', 'large', 'x-large', 'xx-large'} 字体大小

fontstyle or style

{'normal', 'italic', 'oblique'} 字体的样式是否倾斜等

fontweight or weight

{a numeric value in range 0-1000, 'ultralight', 'light', 'normal', 'regular', 'book', 'medium', 'roman', 'semibold', 'demibold', 'demi', 'bold', 'heavy', 'extra bold', 'black'} 文本粗细

horizontalalignment or ha

{'center', 'right', 'left'} 选择文本左对齐右对齐还是居中对齐

linespacing

float (multiple of font size) 文本间距

rotation

float or {'vertical', 'horizontal'} 指text逆时针旋转的角度,“horizontal”等于0,“vertical”等于90

verticalalignment or va

{'center', 'top', 'bottom', 'baseline', 'center_baseline'} 文本在垂直角度的对齐方式

2.3. xlabel和ylabel - 子图的x,y轴标签

set_xlabel的调用方式为

Axes.set_xlabel(xlabel, fontdict=None, labelpad=None, *, loc=None, **kwargs)
(ylabel方式类似)
参数说明:

  • xlabel即为标签内容,
  • fontdict**kwargs用来修改样式,上一小节已介绍,
  • labelpad为标签和坐标轴的距离,默认为4,
  • loc为标签位置,可选的值为'left', 'center', 'right'之一,默认为居中
# 观察labelpad和loc参数的使用效果
fig = plt.figure(figsize=(10,3))
axes = fig.subplots(1,2)
axes[0].set_xlabel('xlabel',labelpad=20,loc='left')# loc参数仅能提供粗略的位置调整,如果想要更精确的设置标签的位置,可以使用position参数+horizontalalignment参数来定位
# position由一个元组过程,第一个元素0.2表示x轴标签在x轴的位置,第二个元素对于xlabel其实是无意义的,随便填一个数都可以
# horizontalalignment='left'表示左对齐,这样设置后x轴标签就能精确定位在x=0.2的位置处
axes[1].set_xlabel('xlabel', position=(0.2, _), horizontalalignment='left');

(不知道为什么loc我报错了,估计是版本问题,问题不大)

2.4. title和suptitle - 子图和画布的标题

title的调用方式为

Axes.set_title(label, fontdict=None, loc=None, pad=None, *, y=None, **kwargs)

  • 其中label为子图标签的内容,fontdict,loc,**kwargs和之前小节相同不重复介绍
  • pad是指标题偏离图表顶部的距离,默认为6
  • y是title所在子图垂向的位置。默认值为1,即title位于子图的顶部。

suptitle的调用方式为figure.suptitle(t, **kwargs)

  • 其中t为画布的标题内容
# 观察pad参数的使用效果
fig = plt.figure(figsize=(10,3))
fig.suptitle('This is figure title',y=1.2) # 通过参数y设置高度
axes = fig.subplots(1,2)
axes[0].set_title('This is title',pad=15)
axes[1].set_title('This is title',pad=20);

# 观察pad参数的使用效果
fig = plt.figure(figsize=(10,3))
fig.suptitle('This is figure title',y=1.2) # 通过参数y设置高度
axes = fig.subplots(1,2)
axes[0].set_title('This is title',pad=15)
axes[1].set_title('This is title',pad=5);

注意:pad数值变化在图形中体现在哪里?

2.5. annotate - 子图的注解

annotate的调用方式为Axes.annotate(text, xy, *args, **kwargs)
其中

  • text为注解的内容,
  • xy为注解箭头指向的坐标,
  • 其他常用的参数包括:
  • xytext为注解文字的坐标,
  • xycoords用来定义xy参数的坐标系,
  • textcoords用来定义xytext参数的坐标系,
  • arrowprops用来定义指向箭头的样式

annotate的参数非常复杂,这里仅仅展示一个简单的例子,更多参数可以查看官方文档中的annotate介绍

fig = plt.figure()
ax = fig.add_subplot()
ax.annotate("",xy=(0.2, 0.2), xycoords='data',xytext=(0.8, 0.8), textcoords='data',arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=0.2"));

 2.6. 字体的属性设置

 字体设置一般有

  1. 全局字体设置
  2. 自定义局部字体设置

两种方法。

#该block讲述如何在matplotlib里面,修改字体默认属性,完成全局字体的更改。
plt.rcParams['font.sans-serif'] = ['SimSun']    # 指定默认字体为新宋体。
plt.rcParams['axes.unicode_minus'] = False      # 解决保存图像时 负号'-' 显示为方块和报错的问题。
#局部字体的修改方法1
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
plt.plot(x, label='小示例图标签')# 直接用字体的名字
plt.xlabel('x 轴名称参数', fontproperties='Microsoft YaHei', fontsize=16)         # 设置x轴名称,采用微软雅黑字体
plt.ylabel('y 轴名称参数', fontproperties='Microsoft YaHei', fontsize=14)         # 设置Y轴名称
plt.title('坐标系的标题',  fontproperties='Microsoft YaHei', fontsize=20)         # 设置坐标系标题的字体
plt.legend(loc='lower right', prop={"family": 'Microsoft YaHei'}, fontsize=10) ;   # 小示例图的字体设置

 三、Tick上的文本

主要是设置tick(刻度)ticklabel(刻度标签)

3.1.简单模式

x1 = np.linspace(0.0, 5.0, 100)
y1 = np.cos(2 * np.pi * x1) * np.exp(-x1)
# 使用axis的set_ticks方法手动设置标签位置的例子,
#该案例中由于tick设置过大,所以会影响绘图美观,不建议用此方式进行设置tick
fig, axs = plt.subplots(2, 1, figsize=(5, 3), tight_layout=True)
axs[0].plot(x1, y1)
axs[1].plot(x1, y1)
axs[1].xaxis.set_ticks(np.arange(0., 10.1, 2.));

#一般绘图时会自动创建刻度,而如果通过上面的例子使用set_ticks创建刻度
#可能会导致tick的范围与所绘制图形的范围不一致的问题。
#所以在下面的案例中,axs[1]中set_xtick的设置要与数据范围所对应,
#然后再通过set_xticklabels设置刻度所对应的标签
import numpy as np
import matplotlib.pyplot as plt
fig, axs = plt.subplots(2, 1, figsize=(6, 4), tight_layout=True)
x1 = np.linspace(0.0, 6.0, 100)
y1 = np.cos(2 * np.pi * x1) * np.exp(-x1)
axs[0].plot(x1, y1)
axs[0].set_xticks([0,1,2,3,4,5,6])axs[1].plot(x1, y1)
axs[1].set_xticks([0,1,2,3,4,5,6])#要将x轴的刻度放在数据范围中的哪些位置
axs[1].set_xticklabels
(['zero','one', 'two', 'three', 'four', 'five','six'],#设置刻度对应的标签
rotation=30, fontsize='small')#rotation选项设定x刻度标签倾斜30度。
axs[1].xaxis.set_ticks_position('bottom')#set_ticks_position()方法是用来设置刻度所在的位置,
#常用的参数有bottom、top、both、none
print(axs[1].xaxis.get_ticklines());

 3.2 Tick Locators and Formatters

除了上述的简单模式,还可以使用Tick Locators and Formatters完成对于刻度位置和刻度标签的设置。 其中

  • Axis.set_major_locator和Axis.set_minor_locator方法用来设置标签的位置
  • Axis.set_major_formatter和Axis.set_minor_formatter方法用来设置标签的格式

这种方式的好处是不用显式地列举出刻度值列表

set_major_formatterset_minor_formatter这两个formatter格式命令可以接收字符串格式(matplotlib.ticker.StrMethodFormatter)或函数参数(matplotlib.ticker.FuncFormatter)来设置刻度值的格式 。

3.2.1 Tick Formatters(设置标签的格式)

# 接收字符串格式的例子
fig, axs = plt.subplots(2, 2, figsize=(8, 5), tight_layout=True)
for n, ax in enumerate(axs.flat):ax.plot(x1*10., y1)formatter = matplotlib.ticker.FormatStrFormatter('%1.1f')
axs[0, 1].xaxis.set_major_formatter(formatter)formatter = matplotlib.ticker.FormatStrFormatter('-%1.1f')
axs[1, 0].xaxis.set_major_formatter(formatter)formatter = matplotlib.ticker.FormatStrFormatter('%1.5f')
axs[1, 1].xaxis.set_major_formatter(formatter);

 

# 接收函数的例子
def formatoddticks(x, pos):"""Format odd tick positions."""if x % 2:return f'{x:1.2f}'else:return ''fig, ax = plt.subplots(figsize=(5, 3), tight_layout=True)
ax.plot(x1, y1)
ax.xaxis.set_major_formatter(formatoddticks);

3.2.2 Tick Locators(设置标签的位置)

在普通的绘图中,我们可以直接通过上图的set_ticks进行设置刻度的位置,缺点是需要自己指定或者接受matplotlib默认给定的刻度。当需要更改刻度的位置时,matplotlib给了常用的几种locator的类型。

如果要绘制更复杂的图,可以先设置locator的类型,然后通过下面的代码绘制即可

axs.xaxis.set_major_locator(locator)

  • locator=plt.MaxNLocator(nbins=7)#自动选择合适的位置,并且刻度之间最多不超过7(nbins)个间隔
  • locator=plt.FixedLocator(locs=[0,0.5,1.5,2.5,3.5,4.5,5.5,6])#直接指定刻度所在的位置
  • locator=plt.AutoLocator()#自动分配刻度值的位置
  • locator=plt.IndexLocator(offset=0.5, base=1)#面元间距是1,从0.5开始
  • locator=plt.MultipleLocator(1.5)#将刻度的标签设置为1.5的倍数
  • locator=plt.LinearLocator(numticks=5)#线性划分5等分,4个刻度
# 接收各种locator的例子
fig, axs = plt.subplots(2, 2, figsize=(8, 5), tight_layout=True)
for n, ax in enumerate(axs.flat):ax.plot(x1*10., y1)locator = matplotlib.ticker.AutoLocator()
axs[0, 0].xaxis.set_major_locator(locator)locator = matplotlib.ticker.MaxNLocator(nbins=3)
axs[0, 1].xaxis.set_major_locator(locator)locator = matplotlib.ticker.MultipleLocator(5)
axs[1, 0].xaxis.set_major_locator(locator)locator = matplotlib.ticker.FixedLocator([0,7,14,21,28])
axs[1, 1].xaxis.set_major_locator(locator);

 3.2.3 补充:日期型刻度(formatter和locator的结合使用)

matplotlib.dates 模块还提供了特殊的设置日期型刻度格式和位置的方式

# 特殊的日期型locator和formatter
locator = mdates.DayLocator(bymonthday=[1,15,25])
formatter = mdates.DateFormatter('%b %d')fig, ax = plt.subplots(figsize=(5, 3), tight_layout=True)
ax.xaxis.set_major_locator(locator)
ax.xaxis.set_major_formatter(formatter)
base = datetime.datetime(2017, 1, 1, 0, 0, 1)
time = [base + datetime.timedelta(days=x) for x in range(len(x1))]
ax.plot(time, y1)
ax.tick_params(axis='x', rotation=70);

 四、图例 legend

legend entry(图例条目)
每个图例由一个或多个legend entries组成。一个entry包含一个key和其对应的label。
legend key(图例键)
每个legend label左面的colored/patterned marker(彩色/图案标记)
legend label(图例标签)
描述由key来表示的handle的文本
legend handle(图例句柄)
用于在图例中生成适当图例条目的原始对象

图例的绘制有OO模式pyplot模式两种方式 ,调用方式都是legend()。

下面的例子中,我们往legend()中传入了两个参数:handles(句柄)和labels(标签)。如果不传入参数,matplotlib会自动寻找合适的图例条目。

fig, ax = plt.subplots()
line_up, = ax.plot([1, 2, 3], label='Line 2')
line_down, = ax.plot([3, 2, 1], label='Line 1')
ax.legend(handles = [line_up, line_down], labels = ['Line Up', 'Line Down']);

 上图中,右侧的方框中的共有两个legend entry;两个legend key,分别是一个蓝色和一个黄色的legend key;两个legend label,一个名为‘Line up’和一个名为‘Line Down’的legend label。

legend其他常用的几个参数:

4.1设置图例位置

loc参数接收一个字符串或数字表示图例出现的位置
ax.legend(loc='upper center') 等同于ax.legend(loc=9)

Location String

Location Code

'best'

0

'upper right'

1

'upper left'

2

'lower left'

3

'lower right'

4

'right'

5

'center left'

6

'center right'

7

'lower center'

8

'upper center'

9

'center'

10

fig,axes = plt.subplots(1,4,figsize=(10,4))
for i in range(4):axes[i].plot([0.5],[0.5])axes[i].legend(labels='a',loc=i)  # 观察loc参数传入不同值时图例的位置
fig.tight_layout()

4.2  设置图例边框及背景

fig = plt.figure(figsize=(10,3))
axes = fig.subplots(1,3)
for i, ax in enumerate(axes):ax.plot([1,2,3],label=f'ax {i}')
axes[0].legend(frameon=False) #去掉图例边框
axes[1].legend(edgecolor='blue') #设置图例边框颜色
axes[2].legend(facecolor='gray'); #设置图例背景颜色,若无边框,参数无效

4.3 设置图例标题

fig,ax =plt.subplots()
ax.plot([1,2,3],label='label')
ax.legend(title='legend title');

 五、思考题

5.1请尝试使用两种方式模仿画出下面的图表(重点是柱状图上的标签),本文学习的text方法和matplotlib自带的柱状图标签方法bar_label

 利用barh中的err参数就可以实现了。

一开始我还在想怎么画出随数值变化的那几条黑直线。有xerr参数就很简单了。

import numpy as np
import matplotlib 
import matplotlib.pyplot as pltx = ['tom','dick','harry','slim','jim'] #按照作业的图片设置的
y = np.linspace(2,12,len(x)) #随便取的数据,和x数量对上
error = np.random.rand(len(x)).round(2) #误差fig,ax = plt.subplots()
ax.set_title('How fast do you want to go today?')
ax.set_xlim(0,20)
for i in range(0, len(x)):ax.text(y[i] + error[i] + 1, x[i], '±' + str(error[i]), fontsize=10,horizontalalignment='center',color='blue')
ax.set_xlim(0,16,2)
ax.set_xlabel('performance')
plt.barh(x,y,xerr = error);
#水平条形图

 

这篇关于【Matplotlib04】文字图例尽眉目的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/407363

相关文章

高效录音转文字:2024年四大工具精选!

在快节奏的工作生活中,能够快速将录音转换成文字是一项非常实用的能力。特别是在需要记录会议纪要、讲座内容或者是采访素材的时候,一款优秀的在线录音转文字工具能派上大用场。以下推荐几个好用的录音转文字工具! 365在线转文字 直达链接:https://www.pdf365.cn/ 365在线转文字是一款提供在线录音转文字服务的工具,它以其高效、便捷的特点受到用户的青睐。用户无需下载安装任何软件,只

Winfrom中解决图像、文字模糊的方法

1.添加清单 2.将清单中的下面内容取消注释

【生日视频制作】酒吧一群美女车展模特大屏幕视频改字AE模板修改文字软件生成器教程特效素材【AE模板】

生日视频制作教程酒吧一群美女车展模特大屏幕视频改字AE模板修改文字特效广软件告生成神器素材祝福玩法AE模板工程 怎么如何做的【生日视频制作】酒吧一群美女车展模特大屏幕视频改字AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤: 安装AE软件 下载AE模板 把AE模板导入AE软件 修改图片或文字 渲染出视频

ORA-01861:文字与格式字符串不匹配

select t.*, t.rowid from log_jk_dtl t; insert into log_jk_dtl (rq,zy,kssj,jssj,memo)  values (to_date(sysdate,'yyyy-mm-dd'),'插入供应商', to_char(sysdate,'hh24:mi:ss'),to_char(sysdate,'hh24:mi:ss'),'备注'

【生日视频制作】劳斯莱斯库里南中控改名软件AE模板修改文字软件生成器教程特效素材【AE模板】

生日视频制作教程豪车劳斯莱斯库里南中控改名软件AE模板修改文字特效广告生成神器素材祝福玩法AE模板工程 怎么如何做的【生日视频制作】劳斯莱斯库里南中控改名软件AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤: 下载AE模板 安装AE软件 把AE模板导入AE软件 修改图片或文字 渲染出视频

透析SPFA算法(图例讲解)

SPFA算法是Bellman-Ford的队列优化,所以先介绍Bellman-Ford算法。        Dijkstra算法是处理单源最短路径的有效算法,但它局限于边的权值非负的情况,若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的。这时候,就需要使用其他的算法来求解最短路径,Bellman-

生产者消费者模型(能看懂文字就能明白系列)

系列文章目录 能看懂文字就能明白系列 C语言笔记传送门 Java笔记传送门 🌟 个人主页:古德猫宁- 🌈 信念如阳光,照亮前行的每一步 前言 本节目标: 理解什么是阻塞队列,阻塞队列与普通队列的区别理解什么是生产者消费者模型生产者消费者模型的主要作用 一、阻塞队列 阻塞独立是一个特殊的队列,它具有以下特点: 线程安全带有阻塞特性:即如果队列为空,这时继续出队列的话,

java把文字转MP3语音案例

一 工具下载: https://download.csdn.net/download/jinhuding/89723540 二代码 <dependency><groupId>com.hynnet</groupId><artifactId>jacob</artifactId><version>1.18</version></dependency> import com.jacob.acti

运用WPS快速整理中英混排的网页文字的方法

朋友从网上下载了一篇技术文档,发现文档中每一行的行末都有一个段落符号,而真正要分段的段首则有4个半角空格,还有许多空段。   想重新编排一下,由于文档比较长,手工操作肯定不行,我向他推荐用WPS文字的“智能格式整理”功能。在该文档处于打开状态时,用鼠标点开“工具”菜单下的“文字工具→智能格式整理”,几秒钟后,所有的段首空格全部消失,段与段之间的空段也全部消除,但每一行行末的段落标记却依然

leetcode:516 最长回文字序列 动态规划

516. 最长回文字序列 题目链接https://leetcode.cn/problems/longest-palindromic-subsequence/ 题目描述 给定一个字符串 s,找到 s 中最长的回文子序列。你可以假设 s 的最大长度为 1000。 示例 1: 输入: "bbbab" 输出: 4解释: 一个可能的最长回文子序列是 "bbbb"。