Matplotlib中plt.annotate和boxstyle的应用

举例说明在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()

标记前的网状图如下:

标记后的网状图如下: 

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这段代码使用 Matplotlib 库绘制了两个子图,其第一个子图绘制了正弦函数的图像,并标注了局部最大值,第二个子图绘制了另一个正弦函数的图像,并添加了箭头标注和水印。 具体解释如下: 1. 导入库和设置文显示 ``` import matplotlib.pyplot as plt import numpy as np plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False %matplotlib inline ``` 这部分代码导入了 Matplotlib 库和 Numpy 库,并设置了文显示。 2. 创建画布和子图 ``` fig=plt.figure() ax1=fig.add_subplot(121) ax2=fig.add_subplot(122) ``` 这部分代码创建了一个画布 `fig` 和两个子图 `ax1` 和 `ax2`。 3. 绘制第一个子图 ``` t=np.arange(0.0,5,0.01) s=np.sin(2*np.pi*t) ax1.plot(t,s,lw=2) ax1.set_ylabel('Y',fontsize=12) ax1.set_xlabel('X',fontsize=12) ax1.set_ylim(-2,2) ax1.text(1,1.2,'max',fontsize=18) ax1.text(1.2,-1.8,'$y=sin(2*np.pi*t)$',bbox=bbox,rotation=10,alpha=0.8) bbox=dict(boxstyle='round',fc='white') plt.annotate('local max',xy=(2.3,1),xytext=(3,1.5), arrowprops=dict(facecolor='black',edgecolor='red',headwidth=7,width=2),bbox=bbox) ``` 这部分代码绘制了第一个子图,包括正弦函数的图像、局部最大值的标注、正弦函数公式的文本框等。 4. 绘制第二个子图 ``` x=np.linspace(0,10,200) y=np.sin(x) ax2.plot(x,y,linestyle='-.',color='purple') ax2.annotate(s='Here I am',xy=(4.8,np.sin(4.8)),xytext=(3.7,-0.2),weight='bold',color='k', arrowprops=dict(arrowstyle='-|>',connectionstyle='arc3',color='red'), bbox=dict(boxstyle='round,pad=0.5',fc='yellow', ec='k',lw=1 ,alpha=0.8)) ax2.set_ylim(-1.5,1.5) ax2.set_xlim(0,10) bbox=dict(boxstyle='round',ec='red',fc='white') ax2.text(6,-1.9,'$y=sin(x)$',bbox=dict(boxstyle='square',facecolor='white',ec='black')) ax2.grid(ls=":",color='gray',alpha=0.5) ax2.text(4.5,1,'NWNU',fontsize=15,alpha=0.3,color='gray',bbox=dict(fc="white",boxstyle='round',edgecolor='gray',alpha=0.3)) ``` 这部分代码绘制了第二个子图,包括另一个正弦函数的图像、箭头标注、水印等。 5. 显示图像 ``` plt.show() ``` 这部分代码显示了绘制的图像。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值