【Matplotlib学习笔记】Part4:文字图例

这篇博客详细介绍了matplotlib库在Python数据可视化中的文本处理,包括text方法、bar_label、Figure和Axes的文本设置、x/y轴标签、标题、子图注解以及字体属性的调整。内容涵盖设置文本位置、样式、标签、图例和刻度,并提供了丰富的代码示例。
摘要由CSDN通过智能技术生成

Part4:文字图例

思考题
  • 本文学习的text方法和matplotlib自带的柱状图标签方法bar_label
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']   #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False   #用来正常显示负号

ex1 = pd.read_csv('layout_ex1.csv')[0:12]
time=ex1['Time'].to_list()
data=ex1['Temperature'].to_list()

fig,ax = plt.subplots(figsize=(6,5))


ax.barh(time,data,alpha=0.5, color='g')

ax.set_xlabel('temperature',position=(0.8,_))
ax.set_ylabel('time',position=(_,0.85))

ax.set_title('墨尔本1981年逐月温度变化')

for i in range(12):
    ax.annotate(f'{round(data[i],3)}', xy=(data[i]-0.2,i), xytext=(data[i]+0.5,i),arrowprops=dict(arrowstyle="-",facecolor='black'));

在这里插入图片描述

一、Figure和Axes
1、示例
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、子图上的文本

text的调用方式为Axes.text(x, y, s, fontdict=None, **kwargs)
其中x,y为文本出现的位置,默认状态下即为当前坐标系下的坐标值,
s为文本的内容,
fontdict是可选参数,用于覆盖默认的文本属性,
**kwargs为关键字参数,也可以用于传入文本样式参数
matplotlib中所有支持的样式参数请参考官网文档说明

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

PropertyDescription
alphafloat or None 透明度,越接近0越透明,越接近1越不透明
backgroundcolorcolor 文本的背景颜色
bboxdict with properties for patches.FancyBboxPatch 用来设置text周围的box外框
color or ccolor 字体的颜色
fontfamily or family{FONTNAME, ‘serif’, ‘sans-serif’, ‘cursive’, ‘fantasy’, ‘monospace’} 字体的类型
fontsize or sizefloat 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’} 选择文本左对齐右对齐还是居中对齐
linespacingfloat (multiple of font size) 文本间距
rotationfloat or {‘vertical’, ‘horizontal’} 指text逆时针旋转的角度,“horizontal”等于0,“vertical”等于90
verticalalignment or va{‘center’, ‘top’, ‘bottom’, ‘baseline’, ‘center_baseline’} 文本在垂直角度的对齐方式
fig = plt.figure(figsize=(5,5))
x,y=range(0,5),range(0,5)
spec = fig.add_gridspec(nrows=2, ncols=2, width_ratios=[2,2], height_ratios=[2,2])
fig.suptitle('title', size=20)
# sub1
ax = fig.add_subplot(spec[0, :])
ax.plot(x,y)
# 使用关键字参数修改文本样式
ax.text(1.5, 3.5, 'modify by **kwargs', style='italic',
        bbox={'facecolor': 'red', 'alpha': 0.5, 'pad': 2});

        
ax = fig.add_subplot(spec[1, :])
ax.plot(x,y)
# 使用fontdict参数修改文本样式
font = {'bbox':{'facecolor': 'red', 'alpha': 0.5, 'pad': 2}, 'style':'italic'}
ax.text(1.5,3.5, 'modify by fontdict', fontdict=font);

在这里插入图片描述

3、x/y轴标签

xlabel的调用方式为Axes.set_xlabel(xlabel, fontdict=None, labelpad=None, *, loc=None, **kwargs)
ylabel方式类似,这里不重复写出。
其中xlabel即为标签内容,
fontdict**kwargs用来修改样式,上一小节已介绍,
labelpad为标签和坐标轴的距离,默认为4,
loc为标签位置,可选的值为’left’, ‘center’, 'right’之一,默认为居中
position标签的具体位置,可以通过horizontalalignment({‘center’, ‘right’, ‘left’})和verticalalignment({‘center’, ‘top’, ‘bottom’, ‘baseline’, ‘center_baseline’})来指定标签位于指定position的相对位置

4、 title和subtitle

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=6);

在这里插入图片描述

5、 子图的注解

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")
            );

在这里插入图片描述

6、字体的属性
#该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上的文本
x1 = np.linspace(0.0, 5.0, 100)
y1 = np.cos(2 * np.pi * x1) * np.exp(-x1)

fig, axs = plt.subplots(2, 1, figsize=(5, 3), tight_layout=True)
axs[0].plot(x1, y1)
axs[1].plot(x1, y1)

# 使用axis的set_ticks方法手动设置标签位置的例子,该案例中由于tick设置过大,所以会影响绘图美观,不建议用此方式进行设置tick
#axs[1].xaxis.set_ticks(np.arange(0, 10, 2));

# 使用axis的set_ticklabels方法手动设置标签格式的例子

ticks = np.arange(0, 6, 1)
tickla = [f'{tick}' for tick in ticks]
axs[1].xaxis.set_ticks(ticks)
axs[1].xaxis.set_ticklabels(tickla);

#一般绘图时会自动创建刻度,而如果通过上面的例子使用set_ticks创建刻度可能会导致tick的范围与所绘制图形的范围不一致的问题。
#所以在下面的案例中,axs[1]中set_xtick的设置要与数据范围所对应,然后再通过set_xticklabels设置刻度所对应的标签
axs[1].set_xticklabels(['zero','one', 'two', 'three', 'four', 'five'],#设置刻度对应的标签
                   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());

在这里插入图片描述

2、tick locators and formatters

除了上述的简单模式,还可以使用Tick Locators and Formatters完成对于刻度位置和刻度标签的设置。
a) 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);

在这里插入图片描述

b) tick locators

# 接收各种locator的例子
fig, axs = plt.subplots(3, 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=10)
axs[0, 1].xaxis.set_major_locator(locator)

#将刻度的标签设置为5的倍数
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)

#线性划分5等分,4个刻度 
locator = matplotlib.ticker.LinearLocator(numticks=5)
axs[2, 0].xaxis.set_major_locator(locator)

#面元间距是10,从0开始 
locator=plt.IndexLocator(offset=0, base=10)
axs[2, 1].xaxis.set_major_locator(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(图例句柄):用于在图例中生成适当图例条目的原始对象

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

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其他常用的几个参数如下:

loc设置图例位置
loc参数接收一个字符串或数字表示图例出现的位置 {‘best’、‘upper right’、‘upper left’、‘lower left’、‘lower right’、‘right’、‘center left’、‘center right’、‘lower center’、‘upper center’、‘center’}

ax.legend(loc='upper center') 

设置图例标题、边框及背景

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(title='legend',frameon=False) #去掉图例边框
axes[1].legend(edgecolor='blue') #设置图例边框颜色
axes[2].legend(facecolor='gray'); #设置图例背景颜色,若无边框,参数无

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值