当图线中某些特殊地方需要标注时,我们可以使用 annotation
.
matplotlib 中的 annotation
有两种方法, 一种是用 plt 里面的 annotate
,一种是直接用 plt 里面的 text
来写标注.
画出基本图
首先,我们在坐标轴中绘制一条直线.
1 2 3 4 5 6 7 8 9
| import matplotlib.pyplot as plt import numpy as np
x = np.linspace(-3, 3, 50) y = 2*x + 1
plt.figure(num=1, figsize=(8, 5),) plt.plot(x, y,) plt.show()
|
移动坐标
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| import matplotlib.pyplot as plt import numpy as np
x = np.linspace(-3, 3, 50) y = 2*x + 1
plt.figure(num=1, figsize=(8, 5),) plt.plot(x, y,)
ax = plt.gca() ax.spines['right'].set_color('none') ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom') ax.spines['bottom'].set_position(('data', 0))
ax.yaxis.set_ticks_position('left') ax.spines['left'].set_position(('data', 0))
plt.show()
|
然后标注出点(x0, y0)
的位置信息. 用 plt.plot([x0, x0,], [0, y0,], 'k--', linewidth=2.5)
画出一条垂直于x轴的虚线.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| import matplotlib.pyplot as plt import numpy as np
x = np.linspace(-3, 3, 50) y = 2*x + 1
plt.figure(num=1, figsize=(8, 5),) plt.plot(x, y,)
ax = plt.gca() ax.spines['right'].set_color('none') ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom') ax.spines['bottom'].set_position(('data', 0))
ax.yaxis.set_ticks_position('left') ax.spines['left'].set_position(('data', 0))
x0 = 1 y0 = 2*x0 + 1
plt.plot([x0, x0,], [0, y0,], 'k--', linewidth=2.5)
plt.scatter([x0, ], [y0, ], s=50, color='b') plt.show()
|
加注释 annotate
接下来我们就对(x0, y0)
这个点进行标注.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| import matplotlib.pyplot as plt import numpy as np
x = np.linspace(-4, 4, 50) y = 2*x + 1
plt.figure(num=1, figsize=(10, 6),) plt.plot(x, y,)
ax = plt.gca() ax.spines['right'].set_color('none') ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom') ax.spines['bottom'].set_position(('data', 0))
ax.yaxis.set_ticks_position('left') ax.spines['left'].set_position(('data', 0))
x0 = 1 y0 = 2*x0 + 1 plt.plot([x0, x0,], [0, y0,], 'k--', linewidth=2.5)
plt.scatter([x0, ], [y0, ], s=50, color='b')
plt.annotate(r'$2x+1=%s$' % y0, xy=(x0, y0), xycoords='data', xytext=(+30, -30), textcoords='offset points', fontsize=16, arrowprops=dict(arrowstyle='->', connectionstyle="arc3,rad=.2"))
plt.show()
|
其中参数 xycoords='data'
是说基于数据的值来选位置, xytext=(+30, -30)
和 textcoords='offset points'
对于标注位置的描述 和 xy
偏差值, arrowprops
是对图中箭头类型的一些设置.
加注释 text
1 2
| plt.text(-3.7, 3, r'$This\ is\ the\ some\ text. \mu\ \sigma_i\ \alpha_t$', fontdict={'size': 16, 'color': 'r'})
|
Text(-3.7,3,'$This\\ is\\ the\\ some\\ text. \\mu\\ \\sigma_i\\ \\alpha_t$')
其中-3.7, 3,
是选取text的位置, 空格需要用到转字符\
,fontdict
设置文本字体.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| import matplotlib.pyplot as plt import numpy as np
x = np.linspace(-4, 4, 50) y = 2*x + 1
plt.figure(num=1, figsize=(10, 6),) plt.plot(x, y,)
ax = plt.gca() ax.spines['right'].set_color('none') ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom') ax.spines['bottom'].set_position(('data', 0))
ax.yaxis.set_ticks_position('left') ax.spines['left'].set_position(('data', 0))
x0 = 1 y0 = 2*x0 + 1 plt.plot([x0, x0,], [0, y0,], 'k--', linewidth=2.5)
plt.scatter([x0, ], [y0, ], s=50, color='b')
plt.annotate(r'$2x+1=%s$' % y0, xy=(x0, y0), xycoords='data', xytext=(+30, -30), textcoords='offset points', fontsize=16, arrowprops=dict(arrowstyle='->', connectionstyle="arc3,rad=.2"))
plt.text(-3.7, 3, r'$This\ is\ the\ some\ text. \mu\ \sigma_i\ \alpha_t$', fontdict={'size': 16, 'color': 'r'})
plt.show()
|
Reference
Checking if Disqus is accessible...