matplotlib;右一个字符串的所有部分

时间:2018-01-06 22:45:41

标签: python matplotlib

我是一个蟒蛇新手。 我创建了一个带有文本框的图表。我遇到的问题是文本框的格式。 我希望'Mean:'左对齐,因为值和它的单位应该正确对齐。基本上问题来自第二行,其中值与上面的值不对应。制表空间不起作用。 我搜索了很多东西并尝试过.rjust等等,但问题似乎是我无法将其包含在我使用的多字符串形式中。

编辑代码!

它产生类似('_'而不是空格:

意思是:____ 8.60 A

Stdev:_3.01 A

但我需要(我只能通过添加空格来解决它)

意思是:___ 8.60 A

Stdev:___ 3.01 A

import numpy as np
import matplotlib.pyplot as plt


x = [1, 2, 3, 4, 5]
y = [4, 7, 9, 10, 13]

fig, ax = plt.subplots()
ax.plot(x, y,)

std = format(round(np.std(y), 2), '.2f')
mean = format(round(np.mean(y),2), '.2f')


plt.gcf().text(0.14, 0.07, ('Mean:        '+(str(mean)+' $\\AA$')+'\nStdev:       '+(str(std)+ ' $\\AA$')), fontsize=20, bbox=dict(facecolor='none', edgecolor='black', pad=10))
plt.subplots_adjust(bottom=0.3)
plt.show()

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

经典地,您可以通过using monospaced fonts解决此类问题。在这些字体中,每个字形(包括空格)具有相同的宽度。因此,您可以使用适当数量的空格来对齐事物。

fig, ax = plt.subplots()
ax.plot(x, y,)

plt.gcf().text(0.14, 0.07, "Mean:{:10.2f} $\\AA$\nStdev:{:9.2f} $\\AA$".format(np.mean(y),np.std(y)), fontdict={'fontsize':20, 'family':'monospace'}, bbox=dict(facecolor='none', edgecolor='black', pad=10))
plt.subplots_adjust(bottom=0.3)
plt.show()

您会注意到我已经简化了您的代码以利用Python's great formatting capabilities。我要求Python将数字np.mean(y)转换为带有2位有效数字({:.2f})的字符串,但另外,我要求结果字符串为10个字符长(包括点和2位有效数字:{:10.2f})。默认情况下,此填充用空格完成,数字右对齐。

它非常强大,因为我不需要知道我的号码在昏迷的左边有多少位数。 "{:10.2f}\n{:10.2f}".format(100,1)将打印

____100.00
______1.00

自动(但当然是空格而不是_)。

有关详细信息,另请参阅https://pyformat.info/

enter image description here

如果您不想使用等宽字体,事情会更复杂。我认为你最好的选择是使用2 Text个对象,一个是文本的左边部分,左边是对齐,另一个是数字的右边对齐。

fig, ax = plt.subplots()
ax.plot(x, y,)

fontprops = {'fontsize':20}
boxprops = dict(facecolor='none', edgecolor='black', pad=10)
plt.gcf().text(0.14, 0.07, "Mean:\nStdev:", fontdict=fontprops)
plt.gcf().text(0.50, 0.07, "{:.2f} A\n{:.2f} A".format(np.mean(y),np.std(y)), fontdict=fontprops, ha='right')
plt.subplots_adjust(bottom=0.3)
plt.show()

enter image description here

您的代码有一个复杂因素,因为您使用mathtext显示Å符号,这使得行间距不相等。因此,您必须使用左侧文本框的行间距来进行对齐。另外,如果您愿意,您必须手动在文本周围绘制Rectangle个对象......最后,我不确定这些努力是否值得。