Matplotlib打卡4文字图例

参考资料:Datawhale学习Matplotlib
只能说,过一遍能知道matplotlib在文本和图例方面达到什么效果,用到再翻再查。。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties 
import numpy as np

一、Figure 和Axes上的文本

1.text

字体属性定义成一个dict,fontdict = dict 设置

#fontdict学习的案例 设置不同的字体样式
#设置字体样式,分别是字体,颜色,宽度,大小
font1 = {'family': 'SimSun',#华文楷体
         'alpha':0.7,#透明度
        'color':  'purple',
        'weight': 'normal',
        'size': 16,
        }
font2 = {'family': 'Times New Roman',
        'color':  'red',
        'weight': 'normal',
        'size': 16,
        }
font3 = {'family': 'serif',
        'color':  'blue',
        'weight': 'bold',
        'size': 14,
        }
font4 = {'family': 'Calibri',
        'color':  'navy',
        'weight': 'normal',
        'size': 17,
        }
 
x = np.linspace(0.0, 5.0, 100)
y = np.cos(2*np.pi*x) * np.exp(-x/3)
plt.plot(x, y, '--')
plt.title('震荡曲线--SimSun华文楷体', fontdict=font1)
#添加文本在指定的坐标处
plt.text(2, 0.65, r'$\cos(2 \pi x) \exp(-x/3)$--Times New Roman', fontdict=font2)
#设置坐标标签
plt.xlabel('Y=time (s)--serif', fontdict=font3)
plt.ylabel('X=voltage(mv)--Calibri', fontdict=font4)
 
# 调整图像边距
plt.subplots_adjust(left=0.1,right=0.9,top=0.9,bottom=0.1) # 子图各边缘的位置比例,【0,1】之间
plt.show()

Matplotlib打卡4文字图例_第1张图片

2. title和set_title

可用参数
label:str,此参数是要添加的文本

fontdict:dict,此参数是控制title文本的外观

loc:str,{‘center’, ‘left’, ‘right’}默认为center

pad:float,该参数是指标题偏离图表顶部的距离,默认为6。

y:float,该参数是title所在axes垂向的位置。默认值为1,即title位于axes的顶部。

3. figtext和text

x,y:float,此参数是指在figure中放置文本的位置。一般取值是在[0,1]范围内。使用transform关键字可以更改坐标系。

s:str,此参数是指文本

fontdict:dict,此参数是一个可选参数,并且是一个覆盖默认文本属性的字典。如果fontdict为None,则由rcParams确定默认值。

4. suptitle

创建title实例,其他参数用到再说吧哈哈哈

t: str,标题的文本

x:float,默认值是0.5.该参数是指文本在figure坐标系下的x坐标

y:float,默认值是0.95.该参数是指文本在figure坐标系下的y坐标

5.xlabel和ylabel

可以像下面的例子使用fontproperties=font 设置,也可以像上面设置一个字典dict,使用fontfict=dict来作为set_xlabel参数

#文本属性的输入一种是通过**kwargs属性这种方式,一种是通过操作 matplotlib.font_manager.FontProperties 方法
#x_label采用**kwargs调整字体属性,y_label则采用 matplotlib.font_manager.FontProperties 方法调整字体属性
x1 = np.linspace(0.0, 5.0, 100)
y1 = np.cos(2 * np.pi * x1) * np.exp(-x1)

font = FontProperties()
font.set_family('serif')
font.set_name('Times New Roman')
font.set_style('italic')

fig, ax = plt.subplots(figsize=(5, 3))
fig.subplots_adjust(bottom=0.15, left=0.2)
ax.plot(x1, y1)
ax.set_xlabel('time [s]', fontsize='large', fontweight='bold')
ax.set_ylabel('Damped oscillation [V]', fontproperties=font) # 前面定义好font,使用Fontproperties方法调整字体属性

plt.show()

Matplotlib打卡4文字图例_第2张图片

6. 字体的属性设置

首先可以查看matplotlib所有可用的字体

from matplotlib import font_manager
font_family = font_manager.fontManager.ttflist
font_name_list = [i.name for i in font_family]
for font in font_name_list[:10]:
    print(f'{font}\n')
STIXSizeThreeSym

STIXSizeTwoSym

cmex10

DejaVu Serif

STIXNonUnicode

cmb10

DejaVu Sans Mono

cmss10

STIXNonUnicode

DejaVu Serif

下面是全局字体属性设置方法

#该block讲述如何在matplotlib里面,修改字体默认属性,完成全局字体的更改。
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimSun']    # 指定默认字体为新宋体。
plt.rcParams['axes.unicode_minus'] = False      # 解决保存图像时 负号'-' 显示为方块和报错的问题。

下面是局部属性设置方法
fontproperties

#局部字体的修改方法1
import matplotlib.pyplot as plt
import matplotlib.font_manager as fontmg

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);    # 小示例图的字体设置

Matplotlib打卡4文字图例_第3张图片

局部字体的修改方法2

import matplotlib.pyplot as plt
import matplotlib.font_manager as fontmg

x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
plt.plot(x, label='小示例图标签')
#fname为你系统中的字体库路径
my_font1 = fontmg.FontProperties(fname=r'C:\Windows\Fonts\simhei.ttf')      # 读取系统中的 黑体 字体。
my_font2 = fontmg.FontProperties(fname=r'C:\Windows\Fonts\simkai.ttf')      # 读取系统中的 楷体 字体。
# fontproperties 设置中文显示,fontsize 设置字体大小
plt.xlabel('x 轴名称参数', fontproperties=my_font1, fontsize=16)       # 设置x轴名称
plt.ylabel('y 轴名称参数', fontproperties=my_font1, fontsize=14)       # 设置Y轴名称
plt.title('坐标系的标题',  fontproperties=my_font2, fontsize=20)       # 标题的字体设置
plt.legend(loc='lower right', prop=my_font1, fontsize=10);              # 小示例图的字体设置

Matplotlib打卡4文字图例_第4张图片

7.数学表达式

看起来latex一样,把公式放在str参数的位置,用引号引起来就行了

import numpy as np
import matplotlib.pyplot as plt
t = np.arange(0.0, 2.0, 0.01)
s = np.sin(2*np.pi*t)

plt.plot(t, s)
plt.title(r'$\alpha_i > \beta_i$', fontsize=20)
plt.text(1, -0.6, r'$\sum_{i=0}^\infty x_i$', fontsize=20)
plt.text(0.6, 0.6, r'$\mathcal{A}\mathrm{sin}(2 \omega t)$',
         fontsize=20)
plt.xlabel('time (s)')
plt.ylabel('volts (mV)')
plt.show()

Matplotlib打卡4文字图例_第5张图片

import matplotlib
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)
fig.subplots_adjust(top=0.85)

# 分别在figure和subplot上设置title
fig.suptitle('bold figure suptitle', fontsize=14, fontweight='bold')
ax.set_title('axes title')

ax.set_xlabel('xlabel')
ax.set_ylabel('ylabel')

# 设置x-axis和y-axis的范围都是[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}) # 设置bbox

ax.text(2, 6, r'an equation: $E=mc^2$', fontsize=15)
font1 = {'family': 'Times New Roman',
        'color':  'purple',
        'weight': 'normal',
        'size': 10,
        }
ax.text(3, 2, 'unicode: Institut für Festkörperphysik',fontdict=font1)
ax.text(0.95, 0.01, 'colored text in axes coords',                     
        verticalalignment='bottom', horizontalalignment='right', # 底部对齐,右端对齐
        transform=ax.transAxes,
        color='green', fontsize=15)

plt.show()

Matplotlib打卡4文字图例_第6张图片

二、Tick上的文本

1. 简单模式

import matplotlib.pyplot as plt
import numpy as np
import matplotlib
x1 = np.linspace(0.0, 5.0, 100)
y1 = np.cos(2 * np.pi * x1) * np.exp(-x1)

使用axis的set_ticks方法手动设置标签位置的例子

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.))
axs[1].set_xticks(np.arange(0., 10.1, 2.))   # 这两种写法都行~~~
plt.show()

Matplotlib打卡4文字图例_第7张图片

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

fig, axs = plt.subplots(2, 1, figsize=(5, 3), tight_layout=True)
axs[0].plot(x1, y1)
axs[1].plot(x1, y1)
ticks = np.arange(0., 8.1, 2.)
tickla = [f'{tick:1.2f}' for tick in ticks]   # 将整数转为两位小数的简洁表达 棒
axs[1].xaxis.set_ticks(ticks) # 这样是第二幅图整数xlabel
axs[1].xaxis.set_ticklabels(tickla)# 这样设置两位小数
plt.show()

Matplotlib打卡4文字图例_第8张图片

设置日期型刻度格式

import matplotlib.dates as mdates
import datetime
# 特殊的日期型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)
plt.show()

Matplotlib打卡4文字图例_第9张图片

三、legend 图例

上一篇最后有讲

举个例子,这里还设置了图例的标题

line_up, = plt.plot([1, 2, 3], label='Line 2')
line_down, = plt.plot([3, 2, 1], label='Line 1')
plt.legend([line_up, line_down], ['Line Up', 'Line Down'],loc=5, title='line',frameon=False);
#loc参数设置图例所在的位置,title设置图例的标题,frameon参数将图例边框给去掉

Matplotlib打卡4文字图例_第10张图片

显示多图legend
发现下面一段不能分成两个cell先画出l1,否则“Can not reset the axes. You are probably trying to re-use an artist in more than one Axes which is not supported

#这个案例是显示多图例legend
import matplotlib.pyplot as plt
import numpy as np
x = np.random.uniform(-1, 1, 4)
y = np.random.uniform(-1, 1, 4)
p1, = plt.plot([1,2,3])
p2, = plt.plot([3,2,1])
l1 = plt.legend([p2, p1], ["line 2", "line 1"], loc='upper left') # 第一个图的legend
p3 = plt.scatter(x[0:2], y[0:2], marker = 'D', color='r')
p4 = plt.scatter(x[2:], y[2:], marker = 'D', color='g')
# 下面这行代码由于添加了新的legend,所以会将l1从legend中给移除
plt.legend([p3, p4], ['label', 'label1'], loc='lower right', scatterpoints=1)
# 这是第二个图
# 为了保留之前的l1这个legend,所以必须要通过plt.gca()获得当前的axes,然后将l1作为单独的artist
plt.gca().add_artist(l1);

Matplotlib打卡4文字图例_第11张图片

一个复杂例子
展示了如何进行坐标轴的移动,如何更改刻度值的样式

修改ticks为任意值,并改为任意字,中文好像不太行

plt.rcParams['font.sans-serif'] = ['SimHei']   #用来正常显示中文标签
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-3,3,50)
y1 = 2*x+1
y2 = x**2
plt.figure()
plt.plot(x,y2)
plt.plot(x,y1,color='red',linewidth=1.0,linestyle = '--')
plt.xlim((-3,5)) # x刻度范围
plt.ylim((-3,5)) # y刻度范围
plt.xlabel('x')
plt.ylabel('y')
new_ticks1 = np.linspace(-3,5,5)
plt.xticks(new_ticks1)
plt.yticks([-2,0,2,5],[r'$one\ shu$',r'$\alpha$',r'$three$',r'four'])# 将y轴标题改成字
'''
上一行代码是将y轴上的小标改成文字,其中,空格需要增加\,即'\ ',$可将格式更改成数字模式,如果需要输入数学形式的α,则需要用\转换,即\alpha
如果使用面向对象的命令进行画图,那么下面两行代码可以实现与 plt.yticks([-2,0,2,5],[r'$one\ shu$',r'$\alpha$',r'$three$',r'four']) 同样的功能
axs.set_yticks([-2,0,2,5])
axs.set_yticklabels([r'$one\ shu$',r'$\alpha$',r'$three$',r'four'])
'''
ax = plt.gca()#gca = 'get current axes' 获取现在的轴
'''
ax = plt.gca()是获取当前的axes,其中gca代表的是get current axes。
fig=plt.gcf是获取当前的figure,其中gcf代表的是get current figure。

许多函数都是对当前的Figure或Axes对象进行处理,
例如plt.plot()实际上会通过plt.gca()获得当前的Axes对象ax,然后再调用ax.plot()方法实现真正的绘图。

而在本例中则可以通过ax.spines方法获得当前顶部和右边的轴并将其颜色设置为不可见
然后将左边轴和底部的轴所在的位置重新设置
最后再通过set_ticks_position方法设置ticks在x轴或y轴的位置,本示例中因所设置的bottom和left是ticks在x轴或y轴的默认值,所以这两行的代码也可以不写
'''
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
ax.spines['left'].set_position(('data',0))
ax.spines['bottom'].set_position(('data',0))#axes 百分比
ax.xaxis.set_ticks_position('bottom')   #设置ticks在x轴的位置
ax.yaxis.set_ticks_position('left')     #设置ticks在y轴的位置
plt.show()

Matplotlib打卡4文字图例_第12张图片

你可能感兴趣的:(画图,python,pycharm,开发语言)