9.添加标注 (Annotations)
10.添加网格线(Grid Lines)
11.显示中文字体
12.保存图形(saving Figures)
13.高质量矢量图输出
9.添加标注 (Annotations)
有时候我们对某点如3∗sin(3∗pi/4)的值特别感兴趣。
import numpy as np
print(3 * np.sin(3 * np.pi / 4))
2.121320343559643
如果想在图标上标出这一点,可以使用annotate函数执行此操作。
import numpy as np
import matplotlib.pyplot as plt
X = np.linspace(-2 * np.pi, 3 * np.pi, 70, endpoint=True)
F1 = np.sin(X)
F2 = 3 * np.sin(X)
ax = plt.gca()
plt.xticks( [-6.28, -3.14, 3.14, 6.28],
[r'$-2\pi$', r'$-\pi$', r'$+\pi$', r'$+2\pi$'])
plt.yticks([-3, -1, 0, +1, 3])
x = 3 * np.pi / 4
plt.scatter([x,],[3 * np.sin(x),], 50, color ='blue')
plt.annotate(r'$(3\sin(\frac{3\pi}{4}),\frac{3}{\sqrt{2}})$',
xy=(x, 3 * np.sin(x)),
xycoords='data',
xytext=(+20, +20),
textcoords='offset points',
fontsize=16,
arrowprops=dict(facecolor='blue'))
plt.plot(X, F1, label="$sin(x)$")
plt.plot(X, F2, label="$3 sin(x)$")
plt.legend(loc='lower left')
plt.show()
我们必须提供有关annotate参数的一些信息。
参数 | 含义 |
---|---|
xy | coordinates of the arrow tip |
xytext | coordinates of the text location |
我们示例的xy和xytext位置在数据坐标中。 我们还可以选择其他坐标系系统。 可以为xy和xytext的坐标系指定字符串值,赋值给xycoords和textcoords。 默认值为“data”:
字符串值 | 坐标系统 |
---|---|
‘figure points’ | Points from the lower left of the figure |
‘figure pixels’ | Pixels from the lower left of the figure |
‘figure fraction’ | Fraction of figure from lower left |
‘axes points’ | Points from lower left corner of axes |
‘axes pixels’ | Pixels from lower left corner of axes |
‘axes fraction’ | Fraction of axes from lower left |
‘data’ | Use the coordinate system of the object being annotated (default) |
‘polar’ | (theta, r) if not native ‘data’ coordinates |
此外,还可以指定箭头的属性。 为此,我们必须为参数arrowprops提供一个箭头属性字典:
arrowprops key | 描述 |
---|---|
width | The width of the arrow in points |
headwidth | The width of the base of the arrow head in points |
headlength | The length of the arrow head in points |
shrink | Fraction of total length to shrink from both ends |
**kwargs | any key for matplotlib.patches.Polygon, e.g., facecolor |
在以下示例中,我们将更改上一示例的箭头的外观:
import numpy as np
import matplotlib.pyplot as plt
X = np.linspace(-2 * np.pi, 3 * np.pi, 70, endpoint=True)
F1 = np.sin(X)
F2 = 3 * np.sin(X)
ax = plt.gca()
plt.xticks([-6.28, -3.14, 3.14, 6.28],
[r'$-2\pi$', r'$-\pi$', r'$+\pi$', r'$+2\pi$'])
plt.yticks([-3, -1, 0, +1, 3])
x = 3 * np.pi / 4
plt.scatter([x, ], [3 * np.sin(x), ], 50, color='blue')
plt.annotate(r'$(3\sin(\frac{3\pi}{4}),\frac{3}{\sqrt{2}})$',
xy=(x, 3 * np.sin(x)),
xycoords='data',
xytext=(+20, +20),
textcoords='offset points',
fontsize=16,
arrowprops=dict(facecolor='blue', headwidth=10, headlength=10, width=2, shrink=0.1))
plt.plot(X, F1, label="$sin(x)$")
plt.plot(X, F2, label="$3 sin(x)$")
plt.legend(loc='lower left')
plt.show()
10.添加网格线(Grid Lines)
import numpy as np
import matplotlib.pyplot as plt
def f(t):
return np.exp(-t) * np.cos(2 * np.pi * t)
def g(t):
return np.sin(t) * np.cos(1 / (t + 0.1))
t1 = np.arange(0.0, 5.0, 0.1)
t2 = np.arange(0.0, 5.0, 0.02)
plt.plot(t1, g(t1), 'ro', t2, f(t2), 'k')
plt.grid(color='b', alpha=0.5, linestyle='dashed', linewidth=1.0)
plt.show()
11.显示中文字体
Matplotlib默认是不支持显示中文字符的。
解决方法: 可以使用 rc 配置(rcParams)来自定义图形的各种默认属性。
Windows操作系统支持的中文字体和代码:
配置方式:
plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei']
示例如下:
import matplotlib.pyplot as plt
# 在jupyter notebook 中,设置下面两行来显示中文
plt.rcParams['font.family'] = ['sans-serif']
# 在 PyCharm 中,只需要下面一行,‘STXingkai’:华文行楷
plt.rcParams['font.sans-serif'] = ['STXingkai']
days = list(range(1,9))
celsius_values = [25.6, 24.1, 26.7, 28.3, 27.5, 30.5, 32.8, 33.1]
plt.plot(days, celsius_values)
plt.xlabel('日期', size=16)
plt.ylabel('摄氏度', size=16)
plt.title('温度变化', size=16)
plt.show()
另外的方法:
在每一处使用到中文输出的地方,都加上一个字体属性fontproperties
import matplotlib.pyplot as plt
days = list(range(1,9))
celsius_values = [25.6, 24.1, 26.7, 28.3, 27.5, 30.5, 32.8, 33.1]
plt.plot(days, celsius_values)
plt.xlabel('日期', fontproperties='SimHei', size=16)
plt.ylabel('摄氏度', fontproperties='STXingkai', size=16)
plt.title('温度变化', fontproperties='SimHei', size=16)
plt.show()
12.保存图形(saving Figures)
savefig方法可用来保存图形到文件中:
fig.savefig(“filename.png”)
可以指定分辨率DPI(Dots Per Inch,每英寸点数)和选择输出文件格式:
可以采用PNG,JPG,EPS,SVG,PGF和PDF格式生成输出。
import matplotlib
import matplotlib.pyplot as plt
fig = plt.figure()
plt.plot([0, 1, 2, 3, 4], [0, 3, 5, 9, 11])
plt.xlabel('Months')
plt.ylabel('Books Read')
plt.show()
fig.savefig('books_read.png')
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
img = mpimg.imread('books_read.png')
plt.imshow(img)
13.高质量矢量图输出
Jupyter Notebook中显示svg矢量图的设置: %config InlineBackend.figure_format = ‘svg’
%matplotlib inline
%config InlineBackend.figure_format = 'svg'
import matplotlib.pyplot as plt
# 在jupyter notebook 中,设置下面两行来显示中文
plt.rcParams['font.family'] = ['sans-serif']
# 在 PyCharm 中,只需要下面一行
plt.rcParams['font.sans-serif'] = ['SimHei']
days = list(range(1,9))
celsius_values = [25.6, 24.1, 26.7, 28.3, 27.5, 30.5, 32.8, 33.1]
fig = plt.figure()
plt.plot(days, celsius_values)
plt.xlabel('日期', size=16)
plt.ylabel('摄氏度', size=16)
plt.title('温度变化', size=16)
plt.show()
fig.savefig('celsius_degrees.svg')