如何添加 count above mean 和 confidence interval errorbar python 的文本?
How to add text of count above mean and confidence interval errorbar python?
我在 matplotlib 中创建了一个误差条图,其中包含每个 bin 的均值和置信区间。现在,我试图在每个错误栏上方添加一个文本标签,说明每个 bin 中的观察数量。到目前为止我有:
binned bin_count val_mean val_ci
(0.1, 0.3] 10 3.13 14.20
(0.3, 0.6] 40 -.1 12.98
(0.6, 0.9] 31 1.8 12.59
(0.9, 1.2] 4 .42. 1.42
bar1 = plt.errorbar(x = df.binned, y = df.val_mean,
yerr = df.val_ci, marker = 'o', linestyle = '', capsize = 4)
i = 0
for line in bar1.lines:
plt.text(x = line.get_xdata(), y = line.get_ydata()+ .1, s = str(df['bin_count'][i]))
i += 1
plt.show()
但我不断收到错误消息:
AttributeError: 'tuple' object has no attribute 'get_xdata'
和
TypeError: only size-1 arrays can be converted to Python scalars
我一直在查看有关如何访问 Line2D 对象的 x 和 y 值以及我所说的内容的文档 get_xdata()。
此外,在测试打印 get_xdata() 时会发生什么时,它会像这样输出 bins:
for line in bar1.lines:
print(line.get_xdata())
输出:
['(.1, .3]', '(0.3, 0.6]', '(0.6, 0.9]', '(0.9, 1.2]']
AttributeError: 'tuple' object has no attribute 'get_xdata'
我不确定如何正确访问每个条的坐标并在误差条顶部打印 bin_count 文本。非常感谢任何帮助。
更新:添加数据框 (df) 代码
df = pd.DataFrame({'binned': ['(0.1, 0.3]', '(0.3, 0.6]', '(0.6, 0.9]', '(0.9, 1.2]'],
'bin_count': [10, 40, 31, 4],
'val_mean': [3.13, -.1, 1.8, .42],
'val_ci': [14.20, 12.98, 12.59, 1.42]})
这是您想要实现的目标吗?
import matplotlib.pyplot as plt
import numpy
df = numpy.array([[
0.1, 0.3, 10, 3.13, 14.2], [
0.3, 0.6, 40, -0.1, 12.98], [
0.6, 0.9, 31, 1.8, 12.59], [
0.9, 1.2, 4, 0.42, 1.42]])
bar1 = plt.errorbar(df[:, 0], y=df[:, 3], yerr=df[:, 4], marker='o', linestyle='', capsize=4)
xx = bar1.lines[0].get_xdata()
yy = bar1.lines[0].get_ydata()
for i in range(len(xx)):
plt.text(x=xx[i], y=yy[i] + .1, s=str(df[:, 2][i]))
i += 1
plt.show()
您可以对您的 df 进行必要的更改,我认为它应该仍然有效。我用这个实现的最终结果显示在这里。
现在请注意,在您的情况下,我假设您的第一列是一个间隔,但您可以在打印语句中注意到您的间隔是一个字符串。我没有投入任何时间来解决您的间隔问题,因为这个问题旨在将 bin 计数作为文本。
我在 matplotlib 中创建了一个误差条图,其中包含每个 bin 的均值和置信区间。现在,我试图在每个错误栏上方添加一个文本标签,说明每个 bin 中的观察数量。到目前为止我有:
binned bin_count val_mean val_ci
(0.1, 0.3] 10 3.13 14.20
(0.3, 0.6] 40 -.1 12.98
(0.6, 0.9] 31 1.8 12.59
(0.9, 1.2] 4 .42. 1.42
bar1 = plt.errorbar(x = df.binned, y = df.val_mean,
yerr = df.val_ci, marker = 'o', linestyle = '', capsize = 4)
i = 0
for line in bar1.lines:
plt.text(x = line.get_xdata(), y = line.get_ydata()+ .1, s = str(df['bin_count'][i]))
i += 1
plt.show()
但我不断收到错误消息:
AttributeError: 'tuple' object has no attribute 'get_xdata'
和
TypeError: only size-1 arrays can be converted to Python scalars
我一直在查看有关如何访问 Line2D 对象的 x 和 y 值以及我所说的内容的文档 get_xdata()。
此外,在测试打印 get_xdata() 时会发生什么时,它会像这样输出 bins:
for line in bar1.lines:
print(line.get_xdata())
输出:
['(.1, .3]', '(0.3, 0.6]', '(0.6, 0.9]', '(0.9, 1.2]']
AttributeError: 'tuple' object has no attribute 'get_xdata'
我不确定如何正确访问每个条的坐标并在误差条顶部打印 bin_count 文本。非常感谢任何帮助。
更新:添加数据框 (df) 代码
df = pd.DataFrame({'binned': ['(0.1, 0.3]', '(0.3, 0.6]', '(0.6, 0.9]', '(0.9, 1.2]'],
'bin_count': [10, 40, 31, 4],
'val_mean': [3.13, -.1, 1.8, .42],
'val_ci': [14.20, 12.98, 12.59, 1.42]})
这是您想要实现的目标吗?
import matplotlib.pyplot as plt
import numpy
df = numpy.array([[
0.1, 0.3, 10, 3.13, 14.2], [
0.3, 0.6, 40, -0.1, 12.98], [
0.6, 0.9, 31, 1.8, 12.59], [
0.9, 1.2, 4, 0.42, 1.42]])
bar1 = plt.errorbar(df[:, 0], y=df[:, 3], yerr=df[:, 4], marker='o', linestyle='', capsize=4)
xx = bar1.lines[0].get_xdata()
yy = bar1.lines[0].get_ydata()
for i in range(len(xx)):
plt.text(x=xx[i], y=yy[i] + .1, s=str(df[:, 2][i]))
i += 1
plt.show()
您可以对您的 df 进行必要的更改,我认为它应该仍然有效。我用这个实现的最终结果显示在这里。
现在请注意,在您的情况下,我假设您的第一列是一个间隔,但您可以在打印语句中注意到您的间隔是一个字符串。我没有投入任何时间来解决您的间隔问题,因为这个问题旨在将 bin 计数作为文本。