举例说明在Matplotlib中如何使用plt.annotate和boxstyle。
Matplotlib在绘制图形时,通常需要在图上添加注释信息来突出重点或解释数据。plt.annotate()方法就是Matplotlib中常用的一个方法。
plt.annotate(s, xy, xytext=None, arrowprops=None, **kwargs)
其中,各参数的具体含义如下:
- s:要添加的注释文本内容;
- xy:注释点的坐标值;
- xytext:注释文本的坐标值,xy和xytext为箭头路径;
- arrowprops:注释指向的箭头的属性;
- **kwargs:其他可选参数(如字体大小、颜色等)。
示例如下:
plt.annotate('文本内容',
xy=(3.23, 1435), #注释点坐标
fontsize=14, #字体大小
xytext=(3.2, 1460), #注释文本坐标
bbox=bbox_props3, #boxstyle
#箭头属性
arrowprops=dict(facecolor='lightgreen',
alpha=1,lw=1,
arrowstyle='fancy',
connectionstyle='arc3,rad=0.1',#有多个参数可选
ec='r',
),
)
BoxStyle 是一个容器类,它定义了几个 boxstyle 类,上面示例中的bbox_props3样式可以创建为:
bbox_props3 = dict(boxstyle="Darrow", facecolor='royalblue', ec="r", lw=2, pad=0.2, alpha=1)
下面使用plt.annotate和boxstyle标记一幅立式冲天炉的网状图,代码如下:
# -*_ coding: utf-8 -*-
#import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['pgf.rcfonts'] = False
plt.rcParams['text.usetex'] = False
plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams['font.sans-serif'] = 'SimHei'
figure = plt.figure(figsize=(15, 8))
ax = figure.add_subplot(1, 1, 1)
figure.patch.set_facecolor('w')
# set_alpha用于指定透明度
figure.patch.set_alpha(1)
ax.clear()
ax.set_xlabel(r'熔化能力'+r'/$t/(m^2\cdot h)$', fontsize=20)
ax.set_ylabel(r'温度'+r'$T/℃$', fontsize=20)
plt.title(r'立式冲天炉网形图'+'\n', fontsize=30)
ax.set_xlim([1.0, 4.0])
ax.set_ylim([1325, 1550])
x_locator = plt.MultipleLocator(0.2)
y_locator = plt.MultipleLocator(25)
ax.xaxis.set_major_locator(x_locator)
ax.yaxis.set_major_locator(y_locator)
plt.tick_params(labelsize=18)
plt.xticks(fontfamily="Times New Roman")
plt.yticks(fontfamily="Times New Roman")
for i in range(12, 40, 2):
plt.vlines(i/10, 1325, 1550, colors='grey', linestyle="-", alpha=0.5)
for j in range(1350, 1550, 25):
plt.hlines(j, 1.0, 4.0, colors='grey', linestyle="-", alpha=0.5)
bbox_props1 = dict(boxstyle="Darrow", facecolor='royalblue', ec="r", lw=2, pad=0.2, alpha=1)
bbox_props2 = dict(boxstyle="Round", facecolor='gold', ec="r", lw=0, pad=0.1, alpha=1)
bbox_props3 = dict(boxstyle="round", facecolor='lightgreen', ec="r", lw=1, pad=0.3, alpha=1)
ax.text(1.8, 1375, "冶金焦比例", ha="center", va="center", color='k', fontsize=16, fontfamily="Microsoft YaHei", rotation=-30, bbox=bbox_props1)
ax.text(1.43, 1455, "18%", ha="center", va="center", color='k', fontsize=20, fontfamily="Microsoft YaHei", rotation=-45, bbox=bbox_props2)
ax.text(1.54, 1436, "17%", ha="center", va="center", color='k', fontsize=20, fontfamily="Microsoft YaHei", rotation=-45, bbox=bbox_props2)
ax.text(1.67, 1413, "16%", ha="center", va="center", color='k', fontsize=20, fontfamily="Microsoft YaHei", rotation=-45, bbox=bbox_props2)
ax.text(1.90, 1390, "15%", ha="center", va="center", color='k', fontsize=20, fontfamily="Microsoft YaHei", rotation=-35, bbox=bbox_props2)
ax.text(2.14, 1375, "14%", ha="center", va="center", color='k', fontsize=20, fontfamily="Microsoft YaHei", rotation=-31, bbox=bbox_props2)
ax.text(2.35, 1360, "13%", ha="center", va="center", color='k', fontsize=20, fontfamily="Microsoft YaHei", rotation=-30, bbox=bbox_props2)
ax.text(2.58, 1340, "12%", ha="center", va="center", color='k', fontsize=20, fontfamily="Microsoft YaHei", rotation=-30, bbox=bbox_props2)
ax.text(1.70, 1520, "送风强度/$Nm^3/(m^2\\cdot s)$", ha="center", va="center", color='k', fontsize=16, fontfamily="Microsoft YaHei", rotation=35, bbox=bbox_props1)
ax.text(1.50, 1470, "0.60", ha="center", va="center", color='k', fontsize=20, fontfamily="Microsoft YaHei", rotation=45, bbox=bbox_props2)
ax.text(1.65, 1490, "0.70", ha="center", va="center", color='k', fontsize=20, fontfamily="Microsoft YaHei", rotation=40, bbox=bbox_props2)
ax.text(1.85, 1513, "0.80", ha="center", va="center", color='k', fontsize=20, fontfamily="Microsoft YaHei", rotation=35, bbox=bbox_props2)
ax.text(2.08, 1526, "0.90", ha="center", va="center", color='k', fontsize=20, fontfamily="Microsoft YaHei", rotation=25, bbox=bbox_props2)
ax.text(2.30, 1532, "1.00", ha="center", va="center", color='k', fontsize=20, fontfamily="Microsoft YaHei", rotation=-10, bbox=bbox_props2)
ax.text(2.52, 1525, "1.10", ha="center", va="center", color='k', fontsize=20, fontfamily="Microsoft YaHei", rotation=-20, bbox=bbox_props2)
x = [3.23, 3.08, 3.23]
y = [1433, 1435, 1425]
cValue = ['r', 'g', 'b']
ax.scatter(x, y, c=cValue, s=250, marker='.')
plt.annotate('1.目前作业点',
xy=(3.23, 1435),
fontsize=14,
xytext=(3.2, 1460),
bbox=bbox_props3,
arrowprops=dict(facecolor='lightgreen',
alpha=1,lw=1,
arrowstyle='fancy',
connectionstyle='arc3,rad=0.1',#有多个参数可选
ec='r',
),
)
plt.annotate('2.减少助燃风',
xy=(3.08, 1436),
fontsize=14,
xytext=(2.9, 1475),
bbox=bbox_props3,
arrowprops=dict(facecolor='lightgreen',
alpha=1,lw=1,
arrowstyle='fancy',
connectionstyle='arc3,rad=0.1',#有多个参数可选
ec='r',
),
)
plt.annotate('3.降低冶金焦比例',
xy=(3.25, 1425),
fontsize=14,
xytext=(3.5, 1450),
bbox=bbox_props3,
arrowprops=dict(facecolor='lightgreen',
alpha=1,lw=1,
arrowstyle='fancy',
connectionstyle='arc3,rad=0.1',#有多个参数可选
ec='r',
),
)
arrow_args = dict(width=3, headwidth=6 ,color='r', headlength=12, shrink=1)
plt.annotate('', xy=(3.10, 1435),
xytext=(3.21, 1433),
ha="center", va="center",
bbox=bbox_props3,
arrowprops=dict(connectionstyle="arc3,rad=0.2",
**arrow_args))
plt.annotate('', xy=(3.21, 1427),
xytext=(3.11, 1434),
ha="center", va="center",
bbox=bbox_props3,
arrowprops=dict(connectionstyle="arc3,rad=0.2",
**arrow_args))
img = plt.imread("grid_of_cupola_clean.png")
x0 = 1.5
x1 = 3.8
y0 =1350
y1 = 1525
ax.imshow(img,extent=[x0, x1, y0, y1], aspect='auto')
plt.vlines(3.23, 1300, 1433, colors='r', linestyle="--", alpha=0.7)
plt.tight_layout()
plt.savefig('Operation01.jpg',dpi=400)
plt.show()
标记前的网状图如下:
标记后的网状图如下: