2013-03-07 53 views
4

我想重建是這樣的:如何使用python // Matplotlib重新創建此圖形?

但用我自己的數據。我的數據如下所示:

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 =數據[ 'STDEV'])'得到的水平誤差條 – tacaswell 2013-03-07 14:10:18

+2

SO是詢問你的代碼_specific_問題的地方。告訴我們你做了什麼,你認爲它應該做什麼,以及它在做什麼,你會得到幫助。請求我們爲您編寫代碼,並且您將被忽略。 – tacaswell 2013-03-07 14:30:01

回答

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

相關問題