2016-09-26 228 views
3

我有以下功能來說明一些等高線:如何在python matplotlib中添加線條到輪廓圖中?

""" 
Illustrate simple contour plotting, contours on an image with 
a colorbar for the contours, and labelled contours. 

See also contour_image.py. 
""" 
import matplotlib 
import numpy as np 
import matplotlib.cm as cm 
import matplotlib.mlab as mlab 
import matplotlib.pyplot as plt 

matplotlib.rcParams['xtick.direction'] = 'out' 
matplotlib.rcParams['ytick.direction'] = 'out' 

X = np.arange(-1.2, 1.2, 0.005) 
Y = np.arange(-1.2, 1.2, 0.005) 
X, Y = np.meshgrid(X, Y) 
Z = (np.ones([np.shape(X)[0],np.shape(X)[1]])-X)**2+100*(Y-(X)**2)**2 


# Create a simple contour plot with labels using default colors. The 
# inline argument to clabel will control whether the labels are draw 
# over the line segments of the contour, removing the lines beneath 
# the label 
levels = np.arange(-100.0, 600, 1.0) 
plt.figure() 
CS = plt.contour(X, 
       Y, 
       Z, 
       levels=levels, 
       ) 
plt.clabel(CS, 
      np.array(filter(lambda lev: lev <5.0, levels)), 
      inline=0.5, 
      fontsize=10, 
      fmt='%1.1f' 
     ) 

plt.hold(True) 


plt.plot(np.arange(-1.0, 1.0, 0.005), 
     np.arange(-1.0, 1.0, 0.005), 
     np.ones(len(np.arange(-1.0, 1.0, 0.005)))*100, '-k') 

plt.title('Contour Lines and Constraint of Rosenbrock Optimiztion Problem') 
plt.show() 

enter image description here

,如果你行註釋掉的等高線圖看起來不錯....:

# plt.hold(True) 


# plt.plot(np.arange(-1.0, 1.0, 0.005), 
#   np.arange(-1.0, 1.0, 0.005), 
#   np.ones(len(np.arange(-1.0, 1.0, 0.005)))*100, '-k') 

enter image description here

...但我不能讓線條顯示疊加在情節,就像我需要他們。我只是簡單地需要將它們疊加在等高線圖上。做這個的最好方式是什麼?

我知道這是possible in R,但如何在Python使用matplotlib做到這一點?

+0

你爲什麼要將三個數組傳遞給'plt.plot'?什麼是第三個數組'np.ones(len(np.arange(-1.0,1.0,0.005)))* 100'應該表示? –

+0

很好的編輯,@ hrbrmstr – guimption

+0

不要垃圾標籤 – hrbrmstr

回答

2

plt.plot從x座標和y座標的序列中繪製出一條二維線。沒有與每個點關聯的z座標,所以不需要傳入第三個數組參數。此刻plt.plot被解釋這些數組作爲兩個單獨的行座標,並且正在做的當量:

plt.plot(np.arange(-1.0, 1.0, 0.005), np.arange(-1.0, 1.0, 0.005)) 
plt.plot(np.ones(len(np.arange(-1.0, 1.0, 0.005)))*100, '-k') 

由於第二行包含x和高達100的y座標,軸將被自動重新縮放,以便等高線圖不再清晰可辨。

我想你可能會想到zorder=參數(它應該只是一個標量而不是數組)。在這種情況下沒有必要 - 因爲您在輪廓之後繪製線條,所以默認情況下它應該比輪廓線更高的zorder。你可以擺脫第三個數組參數來plt.plot

而且,因爲你畫只有兩個點的直線,你只需要傳遞的起點和終點座標:

plt.plot([-1, 1], [-1, 1], '-k') 

enter image description here

+0

之下,謝謝@ali_m。如果這是一條直線,我明白這是如何工作的。如果它是一個功能呢?例如單位圈? – guimption

+1

@guimption「功能」是一個非常廣泛的範疇!如果* x *和* y *值之間存在一對一的對應關係(例如* y = f(x)*),那麼您可以簡單地構造一個x座標範圍(例如使用'np.linspace'),然後評估* f(x)*爲那些* x * - 值。如果它不是一對一的,那麼你可以構造一個參數曲線(例如,一個單位圓可以表示爲* x = cos(t); y = sin(t)*,因此評估* x *和* y *一些* t * s的序列)。對於圓圈的特殊情況,您可以使用'plt.Circle'。 –