使Label,bbox或axes.text的边框与python matplotlib中的Graph的刺齐平

Nor*_*add 5 python text label matplotlib

对于某些手稿,我需要将我的图表标签准确地放置在右上角或左上角。标签需要一个边框,边框的厚度应与图形的刺相同。目前我这样做是这样的:

import matplotlib.pyplot as plt
import numpy as np
my_dpi=96
xposr_box=0.975 
ypos_box=0.94
nrows=3
Mytext="label"
GLOBAL_LINEWIDTH=2
fig, axes = plt.subplots(nrows=nrows, sharex=True, sharey=True, figsize=
               (380/my_dpi, 400/my_dpi), dpi=my_dpi)
fig.subplots_adjust(hspace=0.0001)
colors = ('k', 'r', 'b')
for ax, color in zip(axes, colors):
    data = np.random.random(1) * np.random.random(10)
    ax.plot(data, marker='o', linestyle='none', color=color)

for ax in ['top','bottom','left','right']:
    for idata in range(0,nrows):
        axes[idata].spines[ax].set_linewidth(GLOBAL_LINEWIDTH)


axes[0].text(xposr_box, ypos_box , Mytext, color='black',fontsize=8,
             horizontalalignment='right',verticalalignment='top', transform=axes[0].transAxes,
             bbox=dict(facecolor='white', edgecolor='black',linewidth=GLOBAL_LINEWIDTH)) 

plt.savefig("Label_test.png",format='png', dpi=600,transparent=True)
Run Code Online (Sandbox Code Playgroud)

图片1

所以我用参数控制盒子的位置:

xposr_box=0.975 
ypos_box=0.94
Run Code Online (Sandbox Code Playgroud)

如果更改图的宽度,则框的位置也会更改,但是框的顶部和右侧(或左侧)脊线应始终直接位于图形刺的顶部:

import matplotlib.pyplot as plt
import numpy as np
my_dpi=96
xposr_box=0.975 
ypos_box=0.94
nrows=3
Mytext="label"
GLOBAL_LINEWIDTH=2
fig, axes = plt.subplots(nrows=nrows, sharex=True, sharey=True, figsize=
               (500/my_dpi, 400/my_dpi), dpi=my_dpi)
fig.subplots_adjust(hspace=0.0001)
colors = ('k', 'r', 'b')
for ax, color in zip(axes, colors):
    data = np.random.random(1) * np.random.random(10)
    ax.plot(data, marker='o', linestyle='none', color=color)

for ax in ['top','bottom','left','right']:
    for idata in range(0,nrows):
        axes[idata].spines[ax].set_linewidth(GLOBAL_LINEWIDTH)


axes[0].text(xposr_box, ypos_box , Mytext, color='black',fontsize=8,
             horizontalalignment='right',verticalalignment='top',transform=axes[0].transAxes,
             bbox=dict(facecolor='white', edgecolor='black',linewidth=GLOBAL_LINEWIDTH)) 

plt.savefig("Label_test.png",format='png', dpi=600,transparent=True)
Run Code Online (Sandbox Code Playgroud)

图片2

如果图像较窄而不是较宽,也应该是这种情况。我想避免手动进行操作。有没有办法始终将其放置在应该放置的位置?独立于图的宽度和高度以及堆叠图的数量吗?

Imp*_*est 4

问题在于text元素的位置是相对于文本的范围,而不是相对于其周围的框。虽然原则上可以计算边框填充并将文本定位在 坐标 处(1,1)-borderpadding,但这相当麻烦,因为(1,1)在坐标轴中,而边框填充在图形点中。

然而,有一个不错的选择,使用matplotlib.offsetbox.AnchoredText. 这将创建一个文本框,可以使用图例等位置参数轻松相对于轴放置,例如loc="upper right"。在该文本框周围使用零填充直接将其放置在轴脊柱的顶部。

from matplotlib.offsetbox import AnchoredText
txt = AnchoredText("text", loc="upper right", pad=0.4, borderpad=0, )
ax.add_artist(txt)
Run Code Online (Sandbox Code Playgroud)

一个完整的例子:

import matplotlib.pyplot as plt
from matplotlib.offsetbox import AnchoredText
import numpy as np

my_dpi=96
nrows=3
Mytext="label"
plt.rcParams["axes.linewidth"] = 2
plt.rcParams["patch.linewidth"] = 2

fig, axes = plt.subplots(nrows=nrows, sharex=True, sharey=True, figsize=
               (500./my_dpi, 400./my_dpi), dpi=my_dpi)
fig.subplots_adjust(hspace=0.0001)
colors = ('k', 'r', 'b')
for ax, color in zip(axes, colors):
    data = np.random.random(1) * np.random.random(10)
    ax.plot(data, marker='o', linestyle='none', color=color)

txt = AnchoredText(Mytext, loc="upper right", 
                   pad=0.4, borderpad=0, prop={"fontsize":8})
axes[0].add_artist(txt)

plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述