第四回:文字圖例盡眉目

weixin_44322234發表於2020-12-22

一、Figure和Axes上的文字

Matplotlib具有廣泛的文字支援,包括對數學表示式的支援、對柵格和向量輸出的TrueType支援、具有任意旋轉的換行分隔文字以及Unicode支援。

下面的命令是介紹了通過pyplot API和objected-oriented API分別建立文字的方式。

pyplot APIOO APIdescription
texttextAxes的任意位置新增text。
titleset_titleAxes新增title
figtexttextFigure的任意位置新增text.
suptitlesuptitleFigure新增title
xlabelset_xlabelAxes的x-axis新增label
ylabelset_ylabelAxes的y-axis新增label
annotateannotateAxes的任意位置新增帶有可選箭頭的標註.

1.text

pyplot API:matplotlib.pyplot.text(x, y, s, fontdict=None, **kwargs)
OO API:Axes.text(self, x, y, s, fontdict=None, **kwargs)
引數:此方法接受以下描述的引數:
s:此引數是要新增的文字。
xy:此引數是放置文字的點(x,y)。
fontdict:此引數是一個可選引數,並且是一個覆蓋預設文字屬性的字典。如果fontdict為None,則由rcParams確定預設值。
返回值:此方法返回作為建立的文字例項的文字。

fontdict主要引數具體介紹,更多引數請參考官網說明

PropertyDescription
alphafloat or None 該引數指透明度,越接近0越透明,越接近1越不透明
backgroundcolorcolor 該引數指文字的背景顏色,具體matplotlib支援顏色如下
bboxdict with properties for patches.FancyBboxPatch 這個是用來設定text周圍的box外框
color or ccolor 指的是字型的顏色
fontfamily or family{FONTNAME, ‘serif’, ‘sans-serif’, ‘cursive’, ‘fantasy’, ‘monospace’} 該引數指的是字型的型別
fontproperties or font or font_propertiesfont_manager.FontProperties or str or pathlib.Path
fontsize or sizefloat or {‘xx-small’, ‘x-small’, ‘small’, ‘medium’, ‘large’, ‘x-large’, ‘xx-large’} 該引數指字型大小
fontstretch or stretch{a numeric value in range 0-1000, ‘ultra-condensed’, ‘extra-condensed’, ‘condensed’, ‘semi-condensed’, ‘normal’, ‘semi-expanded’, ‘expanded’, ‘extra-expanded’, ‘ultra-expanded’} 該引數是指從字型中選擇正常、壓縮或擴充套件的字型
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’} 該引數是指選擇文字左對齊右對齊還是居中對齊
labelobject
linespacingfloat (multiple of font size)
position(float, float)
rotationfloat or {‘vertical’, ‘horizontal’} 該引數是指text逆時針旋轉的角度,“horizontal”等於0,“vertical”等於90。我們可以根據自己設定來選擇合適角度
verticalalignment or va{‘center’, ‘top’, ‘bottom’, ‘baseline’, ‘center_baseline’}
                                                |
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
import numpy as np
#fontdict學習的案例
#學習的過程中請嘗試更換不同的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('震盪曲線', fontdict=font1)
#------新增文字在指定的座標處------------
plt.text(2, 0.65, r'$\cos(2 \pi x) \exp(-x/3)$', fontdict=font2)
#---------設定座標標籤
plt.xlabel('Y=time (s)', fontdict=font3)
plt.ylabel('X=voltage(mv)', fontdict=font4)
 
# 調整影像邊距
plt.subplots_adjust(left=0.15)
plt.show()

在這裡插入圖片描述

2.title和set_title

pyplot API:matplotlib.pyplot.title(label, fontdict=None, loc=None, pad=None, *, y=None, **kwargs)
OO API:Axes.set_title(self, label, fontdict=None, loc=None, pad=None, *, y=None, **kwargs)
該命令是用來設定axes的標題。
引數:此方法接受以下描述的引數:
label:str,此引數是要新增的文字
fontdict:dict,此引數是控制title文字的外觀,預設fontdict如下:

{'fontsize': rcParams['axes.titlesize'],
 'fontweight': rcParams['axes.titleweight'],
 'color': rcParams['axes.titlecolor'],
 'verticalalignment': 'baseline',
 'horizontalalignment': loc}

loc:str,{‘center’, ‘left’, ‘right’}預設為center
pad:float,該引數是指標題偏離圖表頂部的距離,預設為6。
y:float,該引數是title所在axes垂向的位置。預設值為1,即title位於axes的頂部。
kwargs:該引數是指可以設定的一些奇特文字的屬性。
返回值:此方法返回作為建立的title例項的文字。

3.figtext和text

pyplot API:matplotlib.pyplot.figtext(x, y, s, fontdict=None, **kwargs)
OO API:text(self, x, y, s, fontdict=None,**kwargs)
引數:此方法接受以下描述的引數:
x,y:float,此引數是指在figure中放置文字的位置。一般取值是在[0,1]範圍內。使用transform關鍵字可以更改座標系。
s:str,此引數是指文字
fontdict:dict,此引數是一個可選引數,並且是一個覆蓋預設文字屬性的字典。如果fontdict為None,則由rcParams確定預設值。
返回值:此方法返回作為建立的文字例項的文字。

4.suptitle

pyplot API:matplotlib.pyplot.suptitle(t, **kwargs)
OO API:suptitle(self, t, **kwargs)
引數:此方法接受以下描述的引數:
t: str,標題的文字
x:float,預設值是0.5.該引數是指文字在figure座標系下的x座標
y:float,預設值是0.95.該引數是指文字在figure座標系下的y座標
horizontalalignment, ha:該引數是指選擇文字水平對齊方式,有三種選擇{‘center’, ‘left’, right’},預設值是 ‘center’
verticalalignment, va:該引數是指選擇文字垂直對齊方式,有四種選擇{‘top’, ‘center’, ‘bottom’, ‘baseline’},預設值是 ‘top’
fontsize, size:該引數是指文字的大小,預設值是依據rcParams的設定:rcParams[“figure.titlesize”] (default: ‘large’)
fontweight, weight:該引數是用來設定字重。預設值是依據rcParams的設定:rcParams[“figure.titleweight”] (default: ‘normal’)
fontproperties:None or dict,該引數是可選引數,如果該引數被指定,字型的大小將從該引數的預設值中提取。
返回值:此方法返回作為建立的title例項的文字。

5.xlabel和ylabel

pyplot API:matplotlib.pyplot.xlabel(xlabel, fontdict=None, labelpad=None, *, loc=None, **kwargs)
     matplotlib.pyplot.ylabel(ylabel, fontdict=None, labelpad=None,*, loc=None, **kwargs)
OO API:  Axes.set_xlabel(self, xlabel, fontdict=None, labelpad=None, *, loc=None, **kwargs)
     Axes.set_ylabel(self, ylabel, fontdict=None, labelpad=None,*, loc=None, **kwargs)
引數:此方法接受以下描述的引數:
xlabel或者ylabel:label的文字
labelpad:設定label距離軸(axis)的距離
loc:{‘left’, ‘center’, ‘right’},預設為center
**kwargs:文字屬性
返回值:此方法返回作為建立的xlabel和ylabel例項的文字。

#文字屬性的輸入一種是通過**kwargs屬性這種方式,一種是通過操作 matplotlib.font_manager.FontProperties 方法
#該案例中對於x_label採用**kwargs調整字型屬性,y_label則採用 matplotlib.font_manager.FontProperties 方法調整字型屬性
#該連結是FontProperties方法的介紹 https://matplotlib.org/api/font_manager_api.html#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)

plt.show()

在這裡插入圖片描述

6.annotate

pyplot API:matplotlib.pyplot.annotate(text, xy, *args,**kwargs)
OO API:Axes.annotate(self, text, xy, *args,**kwargs)

引數:此方法接受以下描述的引數:
text:str,該引數是指註釋文字的內容
xy:該引數接受二維元組(float, float),是指要註釋的點。其二維元組所在的座標系由xycoords引數決定
xytext:註釋文字的座標點,也是二維元組,預設與xy相同
xycoords:該引數接受 被註釋點的座標系屬性,允許的輸入值如下:

屬性值含義
‘figure points’以繪圖區左下角為參考,單位是點數
‘figure pixels’以繪圖區左下角為參考,單位是畫素數
‘figure fraction’以繪圖區左下角為參考,單位是百分比
‘axes points’以子繪圖區左下角為參考,單位是點數(一個figure可以有多個axes,預設為1個)
‘axes pixels’以子繪圖區左下角為參考,單位是畫素數
‘axes fraction’以子繪圖區左下角為參考,單位是百分比
‘data’以被註釋的座標點xy為參考 (預設值)
‘polar’不使用本地資料座標系,使用極座標系

textcoords :註釋文字的座標系屬性,預設與xycoords屬性值相同,也可設為不同的值。除了允許輸入xycoords的屬性值,還允許輸入以下兩種:

屬性值含義
‘offset points’相對於被註釋點xy的偏移量(單位是點)
‘offset pixels’相對於被註釋點xy的偏移量(單位是畫素)

arrowprops:箭頭的樣式,dict(字典)型資料,如果該屬性非空,則會在註釋文字和被註釋點之間畫一個箭頭。如果不設定'arrowstyle' 關鍵字,則允許包含以下關鍵字:

關鍵字說明
width箭頭的寬度(單位是點)
headwidth箭頭頭部的寬度(點)
headlength箭頭頭部的長度(點)
shrink箭頭兩端收縮的百分比(佔總長)
?任何 matplotlib.patches.FancyArrowPatch中的關鍵字

如果設定了‘arrowstyle’關鍵字,以上關鍵字就不能使用。允許的值有:

箭頭的樣式屬性
'-'None
'->'head_length=0.4,head_width=0.2
'-['widthB=1.0,lengthB=0.2,angleB=None
'|-|'widthA=1.0,widthB=1.0
'-|>'head_length=0.4,head_width=0.2
'<-'head_length=0.4,head_width=0.2
'<->'head_length=0.4,head_width=0.2
'<|-'head_length=0.4,head_width=0.2
'<|-|>'head_length=0.4,head_width=0.2
'fancy'head_length=0.4,head_width=0.4,tail_width=0.4
'simple'head_length=0.5,head_width=0.5,tail_width=0.2
'wedge'tail_width=0.3,shrink_factor=0.5

下圖展現了不同的arrowstyle的不同形式
image-20201108230524176

FancyArrowPatch的關鍵字包括:

KeyDescription
arrowstyle箭頭的樣式
connectionstyle連線線的樣式
relpos箭頭起始點相對註釋文字的位置,預設為 (0.5, 0.5),即文字的中心,(0,0)表示左下角,(1,1)表示右上角
patchA箭頭起點處的圖形(matplotlib.patches物件),預設是註釋文字框
patchB箭頭終點處的圖形(matplotlib.patches物件),預設為空
shrinkA箭頭起點的縮排點數,預設為2
shrinkB箭頭終點的縮排點數,預設為2
mutation_scaledefault is text size (in points)
mutation_aspectdefault is 1.
?any key for matplotlib.patches.PathPatch

annotation_clip : 布林值,可選引數,預設為空。設為True時,只有被註釋點在axes時才繪製註釋;設為False時,無論被註釋點在哪裡都繪製註釋。僅當xycoords為‘data’時,預設值空相當於True。
**kwargs:該引數接受任何Text的引數

#此程式碼主要給示範了不同的arrowstyle以及FancyArrowPatch的樣式
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
fig, axs = plt.subplots(2, 2)
x1, y1 = 0.3, 0.3
x2, y2 = 0.7, 0.7

ax = axs.flat[0]
ax.plot([x1, x2], [y1, y2], ".")
el = mpatches.Ellipse((x1, y1), 0.3, 0.4, angle=30, alpha=0.2)
ax.add_artist(el)#在axes中建立一個artist
ax.annotate("",
            xy=(x1, y1), xycoords='data',
            xytext=(x2, y2), textcoords='data',
            arrowprops=dict(arrowstyle="-",#箭頭的樣式
                            color="0.5",
                            patchB=None,
                            shrinkB=0,
                            connectionstyle="arc3,rad=0.3",
                            ),
            )
#在整個程式碼中使用Transform=ax.transAx表示座標相對於axes的bounding box,其中(0,0)是軸的左下角,(1,1)是右上角。
ax.text(.05, .95, "connect", transform=ax.transAxes, ha="left", va="top")

ax = axs.flat[1]
ax.plot([x1, x2], [y1, y2], ".")
el = mpatches.Ellipse((x1, y1), 0.3, 0.4, angle=30, alpha=0.2)
ax.add_artist(el)
ax.annotate("",
            xy=(x1, y1), xycoords='data',
            xytext=(x2, y2), textcoords='data',
            arrowprops=dict(arrowstyle="-",
                            color="0.5",
                            patchB=el,#箭頭終點處的圖形
                            shrinkB=0,
                            connectionstyle="arc3,rad=0.3",
                            ),
            )
ax.text(.05, .95, "clip", transform=ax.transAxes, ha="left", va="top")

ax = axs.flat[2]
ax.plot([x1, x2], [y1, y2], ".")
el = mpatches.Ellipse((x1, y1), 0.3, 0.4, angle=30, alpha=0.2)
ax.add_artist(el)
ax.annotate("",
            xy=(x1, y1), xycoords='data',
            xytext=(x2, y2), textcoords='data',
            arrowprops=dict(arrowstyle="-",
                            color="0.5",
                            patchB=el,
                            shrinkB=5,
                            connectionstyle="arc3,rad=0.3",
                            ),
            )
ax.text(.05, .95, "shrink", transform=ax.transAxes, ha="left", va="top")

ax = axs.flat[3]
ax.plot([x1, x2], [y1, y2], ".")
el = mpatches.Ellipse((x1, y1), 0.3, 0.4, angle=30, alpha=0.2)
ax.add_artist(el)
ax.annotate("",
            xy=(x1, y1), xycoords='data',
            xytext=(x2, y2), textcoords='data',
            arrowprops=dict(arrowstyle="fancy",
                            color="0.5",
                            patchB=el,
                            shrinkB=5,#箭頭終點的縮排點數
                            connectionstyle="arc3,rad=0.3",
                            ),
            )
ax.text(.05, .95, "mutate", transform=ax.transAxes, ha="left", va="top")

for ax in axs.flat:
    ax.set(xlim=(0, 1), ylim=(0, 1), xticks=[], yticks=[], aspect=1)

plt.show()

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-Iz7Nfw45-1608618784024)(output_14_0.png)]

兩個點之間的連線路徑主要有connectionstyle和以下樣式確定

NameAttrs
angleangleA=90,angleB=0,rad=0.0
angle3angleA=90,angleB=0
arcangleA=0,angleB=0,armA=None,armB=None,rad=0.0
arc3rad=0.0
bararmA=0.0,armB=0.0,fraction=0.3,angle=None

其中angle3 和 arc3 中的 3 意味著所得到的路徑是二次樣條段( 三個控制點)
下面的例子豐富的展現了連線線的用法,可以參考學習

import matplotlib.pyplot as plt
def demo_con_style(ax, connectionstyle):
    x1, y1 = 0.3, 0.2
    x2, y2 = 0.8, 0.6

    ax.plot([x1, x2], [y1, y2], ".")
    ax.annotate("",
                xy=(x1, y1), xycoords='data',
                xytext=(x2, y2), textcoords='data',
                arrowprops=dict(arrowstyle="->", color="0.5",
                                shrinkA=5, shrinkB=5,
                                patchA=None, patchB=None,
                                connectionstyle=connectionstyle,
                                ),
                )

    ax.text(.05, .95, connectionstyle.replace(",", ",\n"),
            transform=ax.transAxes, ha="left", va="top")


fig, axs = plt.subplots(3, 5, figsize=(8, 4.8))
demo_con_style(axs[0, 0], "angle3,angleA=90,angleB=0")
demo_con_style(axs[1, 0], "angle3,angleA=0,angleB=90")
demo_con_style(axs[0, 1], "arc3,rad=0.")
demo_con_style(axs[1, 1], "arc3,rad=0.3")
demo_con_style(axs[2, 1], "arc3,rad=-0.3")
demo_con_style(axs[0, 2], "angle,angleA=-90,angleB=180,rad=0")
demo_con_style(axs[1, 2], "angle,angleA=-90,angleB=180,rad=5")
demo_con_style(axs[2, 2], "angle,angleA=-90,angleB=10,rad=5")
demo_con_style(axs[0, 3], "arc,angleA=-90,angleB=0,armA=30,armB=30,rad=0")
demo_con_style(axs[1, 3], "arc,angleA=-90,angleB=0,armA=30,armB=30,rad=5")
demo_con_style(axs[2, 3], "arc,angleA=-90,angleB=0,armA=0,armB=40,rad=0")
demo_con_style(axs[0, 4], "bar,fraction=0.3")
demo_con_style(axs[1, 4], "bar,fraction=-0.3")
demo_con_style(axs[2, 4], "bar,angle=180,fraction=-0.2")

for ax in axs.flat:
    ax.set(xlim=(0, 1), ylim=(0, 1), xticks=[], yticks=[], aspect=1)
fig.tight_layout(pad=0.2)

plt.show()

在這裡插入圖片描述

#以下兩個block懂了之後,annotate基本懂了
#如果想更深入學習可以參看官網案例學習https://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.annotate.html#matplotlib.axes.Axes.annotate
import numpy as np
import matplotlib.pyplot as plt
 
# 以步長0.005繪製一個曲線
x = np.arange(0, 10, 0.005)
y = np.exp(-x/2.) * np.sin(2*np.pi*x)
 
fig, ax = plt.subplots()
ax.plot(x, y)
ax.set_xlim(0, 10)#設定x軸的範圍
ax.set_ylim(-1, 1)#設定x軸的範圍
 
# 被註釋點的資料軸座標和所在的畫素
xdata, ydata = 5, 0
xdisplay, ydisplay = ax.transData.transform_point((xdata, ydata))
 
# 設定註釋文字的樣式和箭頭的樣式
bbox = dict(boxstyle="round", fc="0.8")
arrowprops = dict(
    arrowstyle = "->",
    connectionstyle = "angle,angleA=0,angleB=90,rad=10")
 
# 設定偏移量
offset = 72
# xycoords預設為'data'資料軸座標,對座標點(5,0)新增註釋
# 註釋文字參考被註釋點設定偏移量,向左2*72points,向上72points
ax.annotate('data = (%.1f, %.1f)'%(xdata, ydata),
            (xdata, ydata), xytext=(-2*offset, offset), textcoords='offset points',
            bbox=bbox, arrowprops=arrowprops)
 
# xycoords以繪圖區左下角為參考,單位為畫素
# 註釋文字參考被註釋點設定偏移量,向右0.5*72points,向下72points
disp = ax.annotate('display = (%.1f, %.1f)'%(xdisplay, ydisplay),
            (xdisplay, ydisplay), xytext=(0.5*offset, -offset),
            xycoords='figure pixels',
            textcoords='offset points',
            bbox=bbox, arrowprops=arrowprops)
plt.show()

在這裡插入圖片描述

import numpy as np
import matplotlib.pyplot as plt
 
# 繪製一個極地座標,再以0.001為步長,畫一條螺旋曲線
fig = plt.figure()
ax = fig.add_subplot(111, polar=True)
r = np.arange(0,1,0.001)
theta = 2 * 2*np.pi * r
line, = ax.plot(theta, r, color='#ee8d18', lw=3)
 
# 對索引為800處畫一個圓點,並做註釋
ind = 800
thisr, thistheta = r[ind], theta[ind]
ax.plot([thistheta], [thisr], 'o')
ax.annotate('a polar annotation',
            xy=(thistheta, thisr),  # 被註釋點遵循極座標系,座標為角度和半徑
            xytext=(0.05, 0.05),    # 註釋文字放在繪圖區的0.05百分比處
            textcoords='figure fraction',
            arrowprops=dict(facecolor='black', shrink=0.05),# 箭頭線為黑色,兩端縮排5%
            horizontalalignment='left',# 註釋文字的左端和低端對齊到指定位置
            verticalalignment='bottom',
            )
plt.show()

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-01qNlzQd-1608618784031)(output_18_0.png)]

7.字型的屬性設定

字型設定一般有全域性字型設定和自定義區域性字型設定兩種方法。

#首先可以檢視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:
    print(f'{font}\n')
cmmi10

DejaVu Sans Mono

DejaVu Sans

STIXSizeFourSym

DejaVu Sans Display

DejaVu Serif

STIXGeneral

STIXNonUnicode

STIXSizeFourSym

STIXSizeThreeSym

STIXGeneral

cmr10

STIXNonUnicode

cmsy10

DejaVu Sans

STIXSizeFiveSym

DejaVu Sans

STIXSizeThreeSym

DejaVu Serif Display

DejaVu Sans

cmex10

DejaVu Sans Mono

STIXNonUnicode

STIXSizeOneSym

STIXSizeTwoSym

DejaVu Serif

STIXNonUnicode

cmb10

STIXGeneral

STIXGeneral

DejaVu Serif

STIXSizeOneSym

cmss10

STIXSizeTwoSym

cmtt10

DejaVu Sans Mono

DejaVu Serif

DejaVu Sans Mono

Elephant

Trebuchet MS

Dubai

Microsoft New Tai Lue

Ravie

Verdana

Elephant

Microsoft Tai Le

Book Antiqua

Gill Sans MT Ext Condensed Bold

Nirmala UI

Segoe UI

FZShuTi

Lucida Fax

Eras Demi ITC

STHupo

Constantia

Ebrima

Symbol

DengXian

MS Reference Sans Serif

Yu Gothic

Tahoma

Arial

Agency FB

Corbel

Javanese Text

Castellar

Lucida Sans

FZYaoTi

Lucida Sans

Tahoma

Lucida Sans Typewriter

Gill Sans Ultra Bold Condensed

STZhongsong

Palatino Linotype

Algerian

Matura MT Script Capitals

Franklin Gothic Demi

Cooper Black

Lucida Handwriting

Mistral

Sitka Small

Lucida Bright

Bodoni MT

Parchment

Perpetua Titling MT

Segoe UI

Brush Script MT

Freestyle Script

Calibri

Colonna MT

Century Schoolbook

Georgia

Tw Cen MT

Lucida Bright

Gadugi

Constantia

STFangsong

Sitka Small

Gill Sans MT

DejaVu Sans Mono

Calisto MT

Century Schoolbook

Bodoni MT

Mongolian Baiti

Lucida Sans Typewriter

Berlin Sans FB

Perpetua

Lucida Fax

Century Gothic

Gill Sans MT

Times New Roman

Gadugi

Rockwell

Segoe Script

FangSong

Sitka Small

Papyrus

Californian FB

Microsoft YaHei

High Tower Text

Leelawadee

Rockwell Extra Bold

Bodoni MT

Microsoft JhengHei

Times New Roman

Lucida Fax

Microsoft Uighur

Rage Italic

Cambria

Trebuchet MS

Yu Gothic

Perpetua

Bodoni MT

Tw Cen MT Condensed Extra Bold

Segoe UI

Wingdings 3

Segoe UI

Calisto MT

Century Gothic

Arial Rounded MT Bold

Candara

STSong

Maiandra GD

Microsoft Uighur

Engravers MT

Vladimir Script

DengXian

Palatino Linotype

Calibri

Gigi

Book Antiqua

Bernard MT Condensed

Comic Sans MS

Bodoni MT

Modern No. 20

Britannic Bold

Nirmala UI

Haettenschweiler

Book Antiqua

Californian FB

Times New Roman

Calisto MT

Segoe UI

Segoe Print

Franklin Gothic Medium

Bookman Old Style

Lucida Sans Unicode

Consolas

Segoe UI

STKaiti

Monotype Corsiva

Microsoft PhagsPa

Onyx

Sitka Small

DejaVu Sans Mono

Trebuchet MS

Vivaldi

Arial

Franklin Gothic Medium

Bookman Old Style

Bradley Hand ITC

Segoe MDL2 Assets

Centaur

Times New Roman

Microsoft Sans Serif

Script MT Bold

Lucida Bright

Bodoni MT

Myanmar Text

Cambria

Kristen ITC

Sylfaen

Leelawadee

Rockwell Condensed

Calibri

High Tower Text

Cambria

Wingdings

Courier New

Lucida Calligraphy

MT Extra

Microsoft PhagsPa

Trebuchet MS

Calisto MT

Consolas

Lucida Sans

Calibri

Impact

Segoe UI

Tempus Sans ITC

Verdana

Gill Sans MT

French Script MT

Juice ITC

Dubai

Niagara Solid

Lucida Fax

Bodoni MT

Franklin Gothic Heavy

Goudy Old Style

Bell MT

Comic Sans MS

Arial

Goudy Old Style

Calibri

Lucida Sans Typewriter

Copperplate Gothic Bold

Berlin Sans FB Demi

Garamond

Bell MT

Bookman Old Style

Gloucester MT Extra Condensed

Segoe UI Symbol

Arial

Perpetua

Bodoni MT

Bodoni MT

Harlow Solid Italic

Baskerville Old Face

Georgia

Leelawadee UI

Goudy Stout

Franklin Gothic Book

HoloLens MDL2 Assets

STCaiyun

Webdings

Segoe UI

Arial

Poor Richard

Playbill

Franklin Gothic Medium Cond

STLiti

Bauhaus 93

Microsoft JhengHei

Wide Latin

Corbel

Gill Sans MT

Century

Candara

Corbel

SimSun-ExtB

Lucida Sans

Malgun Gothic

Yu Gothic

Corbel

Chiller

Dubai

Candara

Bell MT

Magneto

Palatino Linotype

LiSu

Informal Roman

Consolas

Century Gothic

Dubai

Book Antiqua

Segoe UI Emoji

Segoe UI

Yu Gothic

Courier New

Harrington

Ebrima

Courier New

Perpetua Titling MT

Segoe UI Historic

Palatino Linotype

Agency FB

Old English Text MT

Lucida Bright

Broadway

Leelawadee UI

Stencil

Microsoft YaHei

Segoe Print

Verdana

Ink Free

DejaVu Sans Mono

Eras Bold ITC

Century Gothic

Arial

MS Outlook

Comic Sans MS

Lucida Sans Typewriter

Curlz MT

Century Schoolbook

Tw Cen MT Condensed

Marlett

Georgia

Georgia

OCR A Extended

Jokerman

Blackadder ITC

Lucida Console

Tw Cen MT

Tw Cen MT Condensed

Bookman Old Style

Showcard Gothic

Kunstler Script

MS Gothic

Comic Sans MS

Copperplate Gothic Light

Perpetua

Californian FB

Candara

MS Reference Specialty

Leelawadee UI

Bookshelf Symbol 7

Franklin Gothic Demi Cond

Microsoft YaHei

Garamond

Niagara Engraved

Bodoni MT

Gill Sans MT Condensed

DengXian

SimSun

Gabriola

Eras Light ITC

Nirmala UI

Candara

KaiTi

Constantia

Bodoni MT

YouYuan

Snap ITC

Viner Hand ITC

MV Boli

Consolas

Palace Script MT

Arial

Century Schoolbook

Berlin Sans FB

Constantia

Pristina

Tw Cen MT

Franklin Gothic Heavy

Arial

Microsoft Tai Le

Franklin Gothic Demi

Tw Cen MT

Corbel

Eras Medium ITC

STXinwei

Cambria

Malgun Gothic

Arial

Garamond

Segoe UI

Malgun Gothic

Footlight MT Light

SimHei

Calibri

Forte

Microsoft Yi Baiti

Verdana

Segoe Script

Rockwell

Segoe UI

Microsoft New Tai Lue

Candara

Franklin Gothic Book

Wingdings 2

Bahnschrift

Imprint MT Shadow

Myanmar Text

Rockwell

STXihei

Rockwell

Edwardian Script ITC

Courier New

Gill Sans Ultra Bold

Microsoft Himalaya

Corbel

Rockwell Condensed

MingLiU-ExtB

Segoe UI

Microsoft JhengHei

STXingkai

Felix Titling

DejaVu Sans Mono

Goudy Old Style

為方便在圖中加入合適的字型,可以嘗試瞭解中文字型的英文名稱,該連結告訴了常用中文的英文名稱

#該block講述如何在matplotlib裡面,修改字型預設屬性,完成全域性字型的更改。
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimSun']    # 指定預設字型為新宋體。
plt.rcParams['axes.unicode_minus'] = False      # 解決儲存影像時 負號'-' 顯示為方塊和報錯的問題。
#區域性字型的修改方法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.legend.Legend at 0x1eb0f5e1348>

在這裡插入圖片描述

#區域性字型的修改方法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.legend.Legend at 0x1eb0f62bf08>

在這裡插入圖片描述

8.數學表示式

在文字標籤中使用數學表示式。有關MathText的概述,請參見 寫數學表示式,但由於數學表示式的練習想必我們都在markdown語法和latex語法中多少有接觸,故在此不繼續展開,願意深入學習的可以參看官方文件.下面是一個官方案例,供參考瞭解。

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()

在這裡插入圖片描述

#這是對前七節學習內容的總結案例
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})

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)

ax.plot([2], [1], 'o')
ax.annotate('annotate', xy=(2, 1), xytext=(3, 4),
            arrowprops=dict(facecolor='black', shrink=0.05))

plt.show()

在這裡插入圖片描述

二、Tick上的文字

設定tick(刻度)和ticklabel(刻度標籤)也是視覺化中經常需要操作的步驟,matplotlib既提供了自動生成刻度和刻度標籤的模式(預設狀態),同時也提供了許多讓使用者靈活設定的方式。

1.簡單模式

可以使用axis的set_ticks方法手動設定標籤位置,使用axis的set_ticklabels方法手動設定標籤格式

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方法手動設定標籤位置的例子,該案例中由於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.))
plt.show()

在這裡插入圖片描述

# 使用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)
axs[1].xaxis.set_ticklabels(tickla)
plt.show()

在這裡插入圖片描述

#一般繪圖時會自動建立刻度,而如果通過上面的例子使用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())
plt.show()
<a list of 14 Line2D ticklines objects>

在這裡插入圖片描述

2.Tick Locators and Formatters

除了上述的簡單模式,還可以使用Tick Locators and Formatters完成對於刻度位置和刻度標籤的設定。
其中Axis.set_major_locatorAxis.set_minor_locator方法用來設定標籤的位置,Axis.set_major_formatterAxis.set_minor_formatter方法用來設定標籤的格式。這種方式的好處是不用顯式地列舉出刻度值列表。

set_major_formatter和set_minor_formatter這兩個formatter格式命令可以接收字串格式(matplotlib.ticker.StrMethodFormatter)或函式引數(matplotlib.ticker.FuncFormatter)來設定刻度值的格式 。

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)

plt.show()

在這裡插入圖片描述

# 接收函式的例子
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)
plt.show()

在這裡插入圖片描述

b) Tick Locators

在普通的繪圖中,我們可以直接通過上圖的set_ticks進行設定刻度的位置,缺點是需要自己指定或者接受matplotlib預設給定的刻度。當需要更改刻度的位置時,matplotlib給了常用的幾種locator的型別。如果要繪製更復雜的圖,可以先設定locator的型別,然後通過axs.xaxis.set_major_locator(locator)繪製即可
locator=plt.MaxNLocator(nbins=7)
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=10)
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)

plt.show()

在這裡插入圖片描述

此外matplotlib.dates 模組還提供了特殊的設定日期型刻度格式和位置的方式

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()

在這裡插入圖片描述

其他案例

#這個案例中展示瞭如何進行座標軸的移動,如何更改刻度值的樣式
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))
plt.ylim((-3,5))
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軸上的小標改成文字,其中,空格需要增加\,即'\ ',$可將格式更改成數字模式,如果需要輸入數學形式的α,則需要用\轉換,即\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()

在這裡插入圖片描述

三、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

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-aaqcXRpC-1608618784045)(attachment:image.png)]

matplotlib.pyplot.legend(*args, **kwargs)

引數:此方法接受以下描述的引數:

keywordDescription
locLocation code string, or tuple (see below).圖例所有figure位置
propthe font property字型引數
fontsizethe font size (used only if prop is not specified)
markerscalethe relative size of legend markers vs. original圖例標記與原始標記的相對大小
markerfirstIf True (default), marker is to left of the label.如果為True,則圖例標記位於圖例標籤的左側
numpointsthe number of points in the legend for line為線條圖圖例條目建立的標記點數
scatterpointsthe number of points in the legend for scatter plot為散點圖圖例條目建立的標記點數
scatteryoffsetsa list of yoffsets for scatter symbols in legend為散點圖圖例條目建立的標記的垂直偏移量
frameonIf True, draw the legend on a patch (frame).控制是否應在圖例周圍繪製框架
fancyboxIf True, draw the frame with a round fancybox.控制是否應在構成圖例背景的FancyBboxPatch周圍啟用圓邊
shadowIf True, draw a shadow behind legend.控制是否在圖例後面畫一個陰
framealphaTransparency of the frame.控制圖例框架的 Alpha 透明度
edgecolorFrame edgecolor.
facecolorFrame facecolor.
ncolnumber of columns 設定圖例分為n列展示
borderpadthe fractional whitespace inside the legend border圖例邊框的內邊距
labelspacingthe vertical space between the legend entries圖例條目之間的垂直間距
handlelengththe length of the legend handles 圖例控制程式碼的長度
handleheightthe height of the legend handles 圖例控制程式碼的高度
handletextpadthe pad between the legend handle and text 圖例控制程式碼和文字之間的間距
borderaxespadthe pad between the axes and legend border軸與圖例邊框之間的距離
columnspacingthe spacing between columns 列間距
titlethe legend title
bbox_to_anchorthe bbox that the legend will be anchored.指定圖例在軸的位置
bbox_transformthe transform for the bbox. transAxes if None.

常用的幾個引數:

(1)設定圖列位置

plt.legend(loc=‘upper center’) 等同於plt.legend(loc=9)

0: ‘best’

1: ‘upper right’
2: ‘upper left’
3: ‘lower left’ |
4: ‘lower right’
5: ‘right’
6: ‘center left’ |
7: ‘center right’
8: ‘lower center’
9: ‘upper center’
10: ‘center’ |

(2)設定圖例字型大小

fontsize : int or float or {‘xx-small’, ‘x-small’, ‘small’, ‘medium’, ‘large’, ‘x-large’, ‘xx-large’}

(3)設定圖例邊框及背景

plt.legend(loc=‘best’,frameon=False) #去掉圖例邊框
plt.legend(loc=‘best’,edgecolor=‘blue’) #設定圖例邊框顏色
plt.legend(loc=‘best’,facecolor=‘blue’) #設定圖例背景顏色,若無邊框,引數無效

(4)設定圖例標題

legend = plt.legend([“CH”, “US”], title=‘China VS Us’)

(5)設定圖例名字及對應關係

legend = plt.legend([p1, p2], [“CH”, “US”])

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.legend.Legend at 0x1eb10938b08>

在這裡插入圖片描述

#這個案例是顯示多圖例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')
 
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.legend.Legend at 0x1eb0f042148>

在這裡插入圖片描述

作業

1.嘗試在一張圖中運用所講過的功能,對title、text、xlable、ylabel、數學表示式、tick and ticklabel、legend進行詳細的設計.
2.閱讀你可能用到文獻或者相關書籍,思考自己如何才能通過學過的例子將自己認為比較好看的圖給復現出來.

參考資料

1.Python學習筆記(4)——Matplotlib中的annotate(註解)的用法

相關文章