我想重新创建这样的东西:
但使用我自己的数据。我的数据如下:
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'])
但我无法让这个情节与我的榜样相似。有人可以为此发布示例代码吗?
答案 0 :(得分: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()
更改注释中单个字母的颜色将非常棘手,因为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()))