контурный контур с экстремальными значениями - PullRequest
0 голосов
/ 14 октября 2019

У меня есть данные, которые я хочу построить с крайними значениями ребер, приведенный ниже общий пример:

import matplotlib.pyplot as plt
plt.style.use('seaborn-white')
import numpy as np

Z = np.random.rand(100,100)

plt.contourf(Z, 100, cmap='RdGy', vmin=0, vmax=1)
plt.colorbar()
plt.show()

Используя приведенный выше код, я получаю этот график:
enter image description here

Но если я изменю только одну строку Z, чтобы она содержала экстремальные значения, она "доминирует" над всем графиком:

import matplotlib.pyplot as plt
plt.style.use('seaborn-white')
import numpy as np

Z = np.random.rand(100,100)
Z[:1] *= 100

plt.contourf(Z, 100, cmap='RdGy', vmin=0, vmax=1)
plt.colorbar()
plt.show()

enter image description here

У меня такой вопрос: во втором примере, хотя у меня есть экстремальные значения, все интересные вещи, очевидно, происходят в диапазоне от 0 до 1, в котором полностью доминирует умножение, которое я ввел в 1-й строке, хотя яустановите vmin и vmax соответственно. Как мне сохранить данные как есть, при этом «фокусируясь» на диапазоне 0-1? Мне все равно, что происходит в первом ряду, для всех, что меня волнует, может быть один цвет для значений 1-100.

Большое спасибо.

1 Ответ

1 голос
/ 14 октября 2019

Это, кажется, известное поведение, о котором сообщалось в этой проблеме GH .

Обходной путь (приведенный в комментариях к проблеме) - использовать итерацию для аргументов levelsвместо того, чтобы полагаться на vmin и vmax.

Вот фрагмент кода, демонстрирующий, как vmin и vmax можно использовать с pcolormesh (как вы сказали в комментарии), но какдля достижения аналогичного результата с contourf.

import matplotlib.pyplot as plt
plt.style.use('seaborn-white')
import numpy as np


def main():
    fig, axs = plt.subplots(2)
    Z = np.random.rand(100,100)
    Z[:1] *= 100

    cmap = plt.get_cmap("viridis")

    p1 = axs[0].pcolormesh(Z, vmin=0., vmax=1, cmap=cmap)
    fig.colorbar(p1, ax=axs[0])
    p2 = axs[1].contourf(Z, levels=np.linspace(0, 1, 100), cmap=cmap)
    fig.colorbar(p2, ax=axs[1], ticks=np.linspace(0, 1, 5))
    plt.show()

if __name__ == '__main__':
    main()

pcolormesh vs. contourf

...