Подравнете цветните полета и етикетите в отделна цветна лента

Опитвам се да създам запълнена контурна диаграма с отделни контурни нива, които трябва да контролирам, за да сравня стойности от различни източници на данни. Мислех, че това трябва лесно да се постигне с 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.)

person maschu    schedule 02.09.2013    source източник
comment
Изпълнението на вашия код на моята машина произвежда този резултат, който не показва същото поведение. Имам инсталиран matplotlub 1.3.0, ако още не сте го направили, може би обмислете актуализиране?   -  person Greg    schedule 03.09.2013
comment
Благодаря - това е интересно. И все пак вашият резултат също не е това, което искам, защото нивата трябва да достигнат до 360 и да показват тъмно червено като краен цвят, въпреки че няма тъмно червено в самата контурна диаграма.   -  person maschu    schedule 03.09.2013
comment
Съжалявам, не разбрах правилно проблема.   -  person Greg    schedule 03.09.2013


Отговори (1)


След известно ровене смятам, че открих проблема ви:

Линията

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

трябва да има level като levels, което означава, че вече вижда правилния аргумент и използва вашите дефинирани от потребителя нива!

person Greg    schedule 03.09.2013
comment
Много благодаря! Това го прави, наистина. Неприятната функция на contourf да приема нивото без оплакване и да изглежда почти правилно. Само едно малко допълнение: ключовата дума ticks=clevel все още има значение - без нея може да получите само всяка втора граница с етикет. - person maschu; 03.09.2013
comment
Добре, премахнах тази част, тъй като не беше особено полезна. - person Greg; 04.09.2013