我该如何使用Python/Matplotlib重新创建这个图形?

5
我希望能够创建类似于这样的东西:

但需要使用我的数据。我的数据长这样:
 Number    Name1        Structure        mean    stdev
 1         Aldehydes    RCH=O       122.76    7.67
 2         Ketones          R2C=O       8.11      0.15
 2         Amides       R-CONr2     20.1      83.24

我该如何重新创建这个图形?我已经完成了以下步骤:
from pylab import *
import numpy  
data = numpy.genfromtxt('data',unpack=True,names=True,dtype=None) 
pos = arange(size(data['Number']))
ax2.errorbar(pos,data['mean'], yerr=data['stdev'])

但我无法让这个图表与我的示例相似。有人能发布一个此类的示例代码吗?

4
使用errorbar(...,xerr=data['stdev'])可以得到水平误差线。 - tacaswell
2
SO是一个关于编程的地方,用来提问你代码中的具体问题。展示你所做的、你认为它应该做什么以及它实际上正在做什么,你就会得到帮助。如果要求我们为你编写代码,你将被大多数人忽视。 - tacaswell
1个回答

1
你可以通过绘制数据的误差条并用相应的文本进行注释来开始。
以下是一个简单的代码供您参考:
import numpy as np
import matplotlib.pyplot as plt

data = np.genfromtxt('data.txt', unpack=True,names=True,dtype=None)

fig, ax = plt.subplots()
ax.set_yticklabels([])
ax.set_xlabel(r'ppm ($\delta$)')
pos = np.arange(len(data))
#invert y axis so 1 is at the top
ax.set_ylim(pos[-1]+1, pos[0]-1)
ax.errorbar(data['mean'], pos, xerr=data['stdev'], fmt=None)

for i,(name,struct) in enumerate(zip(data['Name1'], data['Structure'])):
    ax.text(data['mean'][i], i-0.06, "%s, %s" %(name, struct), color='k', ha='center')

plt.show()

image

改变注释中单个字母的颜色将非常棘手,因为matplotlib不支持多色文本。我尝试使用正则表达式找到一种解决方法,即对相同的文本进行两次注释(一个只有红色的“C”,一个没有“C”),但由于每个字母占据的空间不同,它并不能很好地适用于所有单词(见下文)。
#add to the import
import re

#and change
for i,(name,struct) in enumerate(zip(data['Name1'], data['Structure'])):
    text_b = ax.text(data['mean'][i], i-0.05, "%s, %s" %(name, struct), color='k', ha='center')
    text_b.set_text(text_b.get_text().replace('C', '   '))
    text_r = ax.text(data['mean'][i], i-0.05, "%s %s" %(name, struct), color='r', ha='center')
    text_r.set_text(re.sub('[abd-zABD-Z]', '  ', text_r.get_text()))
    text_r.set_text(re.sub('[0-9\=\-\W]', ' ', text_r.get_text()))

img2


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接