Использование цветовых карт с пороговой линией - PullRequest
0 голосов
/ 08 мая 2020

Я пытаюсь использовать палитру, чтобы показать свои данные. Я просмотрел этот список: https://matplotlib.org/examples/color/colormaps_reference.html

Я обнаружил, что карты данных RdBu и Seismi c подходят для того, чего я хочу достичь с помощью гистограммы. Как я могу включить их в свой код?

Это код, который я использовал:

threshold = 40000
plt.axhline(y = threshold, linewidth=1, color = 'black')


#Plot bar chart and errorbars
#plt.cla()
#data_color = [x / max(y) for x in y]
my_color = []

for k in range(0, len(xvals)):
    if (smax[k] < threshold):
        my_color.append('blue')
    elif (smax[k] > threshold) & (smin[k] < threshold):
        my_color.append('grey')
    else:
        my_color.append('red')

plt.bar(xvals, y, width = 1.0, tick_label = xvals, color = my_color)
plt.errorbar(xvals, y, yerr = yerr1, linestyle = '', capsize = 10, color = 'black')

Это результат, который я получаю: Цвета, добавленные вручную . Хотелось бы, чтобы их брали из RdBu / Seismi c

1 Ответ

0 голосов
/ 08 мая 2020

Я дам объяснение того, что вы делаете, что, вероятно, поможет вам отладить вашу проблему.

np.linespace

np.linspace(.1, .9, 10) возвращает 10 равномерно расположенных чисел в интервале 0,1 - 0,9 :
[0.1 0.18888889 0.27777778 0.36666667 0.45555556 0.544444440.63333333 0.72222222 0.81111111 0.9]


cm.seismi c

Затем вы вводите указанный выше массив в cm.seismic. Это даст значение цвета для каждой точки linspace, начиная с синего до красного.
Итак, набрав cm.seismic(np.linspace(.1, .9, 10)), вы получите следующее цветовое отображение:

Red         Green      Blue       Alpha (Opacity)
[0.         0.         0.5745098  1.        ]
[0.         0.         0.82705882 1.        ]
[0.11372549 0.11372549 1.         1.        ]
[0.45882353 0.45882353 1.         1.        ]
[0.81960784 0.81960784 1.         1.        ]
[1.         0.81960784 0.81960784 1.        ]
[1.         0.45882353 0.45882353 1.        ]
[1.         0.11372549 0.11372549 1.        ]
[0.87647059 0.         0.         1.        ]
[0.69607843 0.         0.         1.        ]

Итак, первая точка вашего data получит первую строку вышеуказанного массива в качестве значения цвета и т. д.


plt.bar

В вашем случае вы строите 4 точки данных (столбцы). Таким образом, первая полоса будет иметь в качестве цвета первая строка цветовой карты (0. 0. 0.5745098 1.), которая является темно-синей.
Имея 4 полосы на ваших данных, вы будете использовать только первые 4 строки вашей цветовой карты, никогда не достигая красные цвета.

Код, который я использовал для воспроизведения вашего вопроса:

import numpy as np
import matplotlib.pyplot as plt

xvals = [0,1,2,3]
y = np.array([30000,35000,40000,50000])
cmap=plt.get_cmap("seismic")
print(np.linspace(.1, .9, 10))
my_colors = cmap(np.linspace(.1, .9, 10))
print(my_colors)
plt.bar(xvals, y, width = 1.0, tick_label = xvals, color=my_colors)

plt.show()

Наконец, , если вы пытаетесь добиться определенного c вывода, отредактируйте свой вопрос и Я обновлю свой ответ.

...