Используя brewer2mpl расходящуюся цветовую карту с matplotlib, гамма дает плохие результаты со значениями, отличными от 1 - PullRequest
1 голос
/ 27 января 2020

Играя с цветными картами в этот вопрос Я был представлен brewer2mpl в комментариях. Для расходящейся карты (с нулем посередине) я заметил, что гамма реализована так, чтобы работать наивно и поэтому дает неожиданные результаты, когда она не равна 1. Нейтральный тон, предназначенный для представления нуля скользит вокруг так, чтобы значения около нуля были синего цвета с гаммой = 0,5 и оранжевым, когда гамма = 1,5

Можно ли в любом случае сделать гамма-подобный параметр, который работает симметрично вокруг нуля в matplotlib или brewer2mpl или сделать Мне просто нужно как-то сделать это вручную, подняв np.abs(u) до некоторой степени, а затем повторно нормализовать и снова ввести знак?

Ожидаемое поведение будет заключаться в симметричном применении гаммы относительно нуля. ; по крайней мере, это то, что ожидал .

divergent colormap with brewer2mpl and gamma not equal to 1 gives bad results

import numpy as np
import matplotlib.pyplot as plt
import brewer2mpl

Re = 6378137. # meters
J2 = 1.7555E+25 # m^5/s^2
hw = 400
x = np.linspace(-2.5*Re, 2.5*Re, 2*hw+1)
x, z = np.meshgrid(x, x)
r = np.sqrt(x**2 + z**2)
u = J2 * r**-5 * 0.5 * (3*z**2 - r**2)
u[r<Re] = np.nan

if True:
    umax = np.nanmax(np.abs(u))
    bmap = brewer2mpl.get_map('RdBu', 'Diverging', 9)
    gammas = 0.5, 1, 1.5
    plt.figure()
    for i, gamma in enumerate(gammas):
        cmap = bmap.get_mpl_colormap(N=100, gamma=gamma)
        plt.subplot(1, 3, i+1)
        plt.imshow(u, cmap=cmap, vmin=-umax, vmax=umax)
        plt.colorbar()
        plt.title('gamma = ' + str(gamma))
        plt.plot([hw, hw], [0.3*hw, 1.7*hw], '-k')
        plt.xlim(0, 2*hw+1)
        plt.ylim(0, 2*hw+1)
    plt.suptitle("Earth's geopotential's J2 component", fontsize=16)
    plt.show()

1 Ответ

1 голос
/ 29 января 2020

Вы можете создать две карты цветов, одну от красного до белого, одну от белого до синего. Затем примените гамму к каждому из них. Наконец, получите цвета из этих цветовых карт и создайте новый с комбинированными цветами.

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap
from copy import copy

cmap = plt.get_cmap("RdBu", lut=256)
# Create two new colormaps, each with one half of the original
cmap_lower = LinearSegmentedColormap.from_list("", cmap(np.arange(0,128)))
cmap_upper = LinearSegmentedColormap.from_list("", cmap(np.arange(128,256)))
gammas = [1, 0.5, 1.5]


fig, axs = plt.subplots(ncols=3, figsize=(8,5))

for ax, gamma in zip(axs, gammas):
    # copy each colormap and set the respective gamma
    cm1 = copy(cmap_lower)
    cm1.set_gamma(gamma)
    cm2 = copy(cmap_upper)
    cm2.set_gamma(gamma)
    # get the colors from the each
    colors = np.concatenate((cm1(np.arange(0,256)), cm2(np.arange(0,256))), axis=0) 
    this_cmap = LinearSegmentedColormap.from_list("", colors)

    im = ax.imshow(np.arange(300).reshape(30,10), cmap=this_cmap)
    fig.colorbar(im, ax=ax)
    ax.set_title(f"gamma={gamma}")

plt.show()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...