2013-09-02 7 views
1

다른 데이터 소스의 값을 비교하기 위해 제어해야하는 개별 윤곽선 레벨로 채워진 등고선 플롯을 작성하려고합니다. 나는 이것이 fig.colorbar(c, ax=ax, ticks=my_levels)으로 쉽게 이루어져야한다고 생각했다. 그러나 아래 예제에서 볼 수 있듯이 색상과 값의 정렬에 문제가 발생하며 코드에 어떤 문제가 있는지 파악할 수 없었습니다.컬러 필드와 라벨을 개별 컬러 막대에 정렬

# -*- coding: cp1252 -*- 
import matplotlib 
import matplotlib.pyplot as plt 
from matplotlib.ticker import ScalarFormatter 
import numpy as np 

def plot_discrete(x, y, data, cmax, nclevel=11): 
    """Plot filled contour plot and add colorbar with discrete (linear) spacing""" 
    matplotlib.rcParams.update({'font.size' : 22}) 
    # prepare plot 
    fig = plt.figure(figsize=(10,7), dpi=150) 
    fig.suptitle(unicode("Test ÄÖÜßäöü","latin-1"), fontsize=20, fontweight='bold') 
    ax = fig.add_subplot(1,1,1) 
    # determine contour levels and set color scale (norm) 
    clevel = np.linspace(0., cmax, nclevel) 
    print "clevel = ", clevel 
    print "cmax, max(data) = ", cmax, np.max(data) 
    norm = matplotlib.colors.BoundaryNorm(clevel, ncolors=256, clip=False) 
    # generate the contour plot 
    c = ax.contourf(x, y, data, level=clevel, norm=norm) 
    # prep up axis formatting and labelling 
    ax.set_xlabel('X',{'fontsize':20}) 
    ax.set_ylabel('Y',{'fontsize':20}) 
    ax.xaxis.set_major_formatter(ScalarFormatter()) 
    ax.yaxis.set_major_formatter(ScalarFormatter()) 
    # add the colorbar 
    fig.colorbar(c, ax=ax, norm=norm, ticks=clevel, boundaries=clevel) 
    plt.show() 


if __name__ == "__main__": 
    x = np.linspace(0.,10.,20) 
    y = np.linspace(-10.,10.,21) 
    data = np.zeros((x.size, y.size)) 
    for i,xx in enumerate(x): 
     for j,yy in enumerate(y): 
      data[i,j] = np.sqrt(xx)*yy**2 
    plot_discrete(y, x, data, 360.) 
+0

내 컴퓨터에서 코드를 실행하면 [이 출력물을 생성합니다] (http://imgur.com/ff0lUHO)는 동일한 동작을 나타내지 않습니다. 이미 업데이트를 고려하지 않았다면 matplotlub 1.3.0을 설치 했습니까? – Greg

+0

감사합니다. 흥미 롭습니다. 그러나 윤곽 플롯 자체에 진한 빨간색이 없더라도 레벨이 360까지 올라야하고 어두운 색을 최종 색상으로 표시해야하므로 원하는 결과가 아 닙니다. – maschu

+0

죄송합니다. 문제를 제대로 이해하지 못했습니다. – Greg

답변

1

내가 문제를 발견했다 생각 뒷조사 후 :

라인이

c = ax.contourf(x, y, data, level=clevel, norm=norm) 

levels으로 level을 가져야 여기

Example for mis-aligned colors in colorbar

코드입니다 그것은 지금 그것이 의미하는 것을 의미한다. 적절한 인수와 사용자 정의 수준을 사용!

+0

많은 감사합니다! 이것은 실제로 그것을합니다. contourf의 불쾌한 "특징"은 불만없이 "레벨"을 받아들이고 거의 옳게 보이도록 만듭니다. 단지 하나의 작은 추가 : "틱 = clevel"키워드는 여전히 차이를 만듭니다 - 그것 없이는 모든 초 경계를 표시 할 수 있습니다. – maschu

+0

그래, 특히 도움이되지 않았으므로 그 부분을 제거했습니다. – Greg