2015-12-18 22 views
1

我具有下面給出的形式的數據(link):如何旋轉標籤以遵循Python中的輪廓?

Y X 0 X 10 X 20 
15 4.83 4.91 4.99 
20 4.58 4.65 4.73 
25 4.43 4.49 4.56 

我試圖繪製X 標籤值的輪廓,在這些情況下爲0,10,20(如在代碼z),其中X軸爲X值,Y軸爲Y值。圖是使用的代碼創建:

import numpy as np 
import re 
from matplotlib.backends.backend_pdf import PdfPages 
import matplotlib.pyplot as plt 
import matplotlib.cm as cm 

with open('contour.dat', "r") as data: 
    while True: 
     line = data.readline() 
     if not line.startswith('#'): 
      break 
    data_header = [i for i in line.strip().split('\t') if i] 
_data_ = np.genfromtxt('contour.dat', skiprows = 2, delimiter = '\t') 
x = _data_[:, 0] 
y = _data_[:, 1:] 


y_n = [] 
for i in range(len(data_header)): 
    if data_header[i][0] == 'X': 
     y_n = np.int_(np.append(y_n, i)) 
y_index = [data_header[i] for i in y_n] 
z = [] 
for i in range(0, len(data_header)): 
    z = np.append(z, re.findall(r"[-+]?\d*\.\d+|\d+", data_header[i])) 
z = z.reshape(len(z), 1) 
xm = np.tile(x, 21) 
xm = np.reshape(xm,(21, 10)).T 
zm = np.tile(z, 10).T 

with PdfPages('./on_tau.pdf') as p_tau: 
    _p_vs_tau_ = plt.figure(figsize=(5, 5)) 
    _p_vs_tau_.clf() 
    p_vs_tau = plt.subplot(111) 
    # x, y = np.meshgrid(x, y) 
    surf = plt.contourf(y, xm, zm, 22, rstride=1, cstride=1, cmap=cm.gist_heat, 
          linewidth=0, antialiased=False, alpha = 1.0) 
    surf1 = plt.contour(y, xm, zm, 22, colors = '#000000', 
          linewidths=0.5, antialiased=False, alpha = 1.0) 
    plt.clabel(surf1, inline=1, fontsize=6) 
    plt.xlim([5, 10]) 
    p_tau.savefig(bbox_inches='tight') 
    plt.close() 

我試圖解決以下問題:

1.目前所有的輪廓標籤是垂直的。我如何旋轉 標籤以追蹤輪廓?

2.如何更改標籤的位置使其不重疊(如圖所示)?

enter image description here

其他問題

3.如何保證標籤始終顯示在圖表即使軸 限制改變了嗎?

+0

最簡單的方法可能是使用鼠標手動定位標籤。您可以通過將'manual = True'傳遞給['plt.clabel']來執行此操作(http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.clabel)。 –

+1

你使用的是什麼版本的mpl?標籤默認應該旋轉,參見http://matplotlib.org/examples/pylab_examples/contour_demo.html – tacaswell

+0

版本是1.4.3。 –

回答

1

我跑到下面的代碼在matplotlib 1.4.3,當你想獲得旋轉等高線標籤,所以,我不知道你爲什麼有這個問題。對於你的第二個問題,使用更少的輪廓等級怎麼樣?

import numpy as np 
from matplotlib.backends.backend_pdf import PdfPages 
import matplotlib.pyplot as plt 

x, y = np.pi*np.mgrid[-1:1:101j, -1:1:101j] 
z = np.sin(x)*np.sin(y) 

with PdfPages('./contour_plot.pdf') as p_tau: 
    _p_vs_tau_ = plt.figure(figsize=(5, 5)) 
    _p_vs_tau_.clf() 
    p_vs_tau = plt.subplot(111) 
    surf = plt.contourf(y, x, z, 21, rstride=1, cstride=1, cmap="RdYlBu", 
          linewidth=0, antialiased=False, alpha = 1.0) 
    surf1 = plt.contour(y, x, z, 21, colors='k', linestyles="solid", 
          linewidths=0.5, antialiased=False, alpha = 1.0) 
    plt.clabel(surf1, inline=1, fontsize=6) 
    plt.savefig("contour_plot.png", dpi=600) 
    p_tau.savefig(bbox_inches='tight')  
    plt.close() 

enter image description here