python matplotlib связь между colormap и vmax / vmin - PullRequest
0 голосов
/ 07 февраля 2020

Я новичок в python matplotlib, я пробую разные настройки в cmp и vmax, vmin

Для моего понимания, если результат выше vmax, результат покажет конец цветовой карты (темный) и результат ниже, чем vmin, результат показывает оригинал цветовой карты (светлый), как pic1 pic1

Но когда я установил vmax или vmin из результата, как цвет соотносится с результатом? Почему он выглядит так?

, например, когда я устанавливаю vmin вне диапазона и результат показывает бул, но в моем cmp нет синего цвета, см. рис2 pic2

, и когда vmax выходит за пределы диапазона, результат показывает светлый цвет, для моего понимания цвета должно быть таким же, как cmp=plt.cm.Greens см. рис3 pic3

я загружаю пи c. Вот мой код:

#!/usr/bin/python
import matplotlib.pyplot as plt


num=range(1,100)
out=[x**2 for x in num]
plt.figure(figsize=(11, 11))


plt.title('Scatter',size=24)
plt.ylabel('Result',size=24)
plt.xlabel('Number',size=24)
plt.axis([0, 110, 0, 11000])

plt.scatter(num,out,s=50,lw=2,c=out,cmap=plt.cm.Greens,marker='o',label='Scatter',vmin=99999)
plt.show()

1 Ответ

1 голос
/ 07 февраля 2020

Лучший способ увидеть, что происходит, - добавить цветную полосу (plt.colorbar(), после создания графика рассеяния). Вы заметите, что все значения out между 0 и 10000 находятся ниже самой нижней части шкалы, где все очень светло-зеленое.

Как правило, значения ниже vmin будут окрашены самый низкий цвет и значения выше vmax получат самый высокий цвет.

Если вы установите vmax меньше vmin, внутренне они будут заменены. Хотя, в зависимости от конкретной версии matplotlib и вызываемых функций, matplotlib может выдавать предупреждение об ошибке. Поэтому лучше всего установить vmin всегда ниже vmax.

Если вы не установите vmin, он будет автоматически рассчитан как минимум данных. Точно так же, если вы не установите vmax, он будет установлен на максимум данных. Таким образом, если вы установите vmin=99999 и не установите vmax, vmax будет вычислено как 10000. Как и теперь vmax < vmin, matplotlib поменяет их местами, поэтому вы заканчиваете vmin=10000 and vmax = 99999`, как показано на панели цветов.

Если вы не установите цветовую карту (cmap=), matplotlib автоматически будет использовать 'viridis' . Эта цветовая карта имеет темно-фиолетовый / синий цвет около vmin.

Если вы не установите параметр c=, цвет будет взят из цикла свойств по умолчанию . Итак, в первый раз он называется синим цветом, в следующий раз оранжевым, затем зеленым, затем красным, .... Есть 10 цветов, после чего цвета начинаются снова с синего. (Цветовая карта называется 'tab10' в текущих версиях matplotlib.) Обратите внимание, что vmin и vmax игнорируются, если вы не установите c=.

. В приведенном ниже коде я добавил красная линия, где значения out принадлежат цветовой шкале. Вы можете поэкспериментировать с различными значениями vmin и vmax, чтобы увидеть, что происходит. Обычно проще всего не заполнять их и позволить matplotlib рассчитать их автоматически.

import matplotlib.pyplot as plt

num = range(1, 100)
out = [x ** 2 for x in num]
plt.figure(figsize=(11, 11))

plt.title('Scatter', size=24)
plt.ylabel('Result', size=24)
plt.xlabel('Number', size=24)
plt.axis([0, 110, 0, 11000])

plt.scatter(num, out, s=50, lw=2, c=out, cmap=plt.cm.Greens, marker='o', label='Scatter', vmin=99999)
# plt.colorbar()
cbar = plt.colorbar()
cbar.ax.vlines(1, min(out), max(out), color='crimson', lw=3, clip_on=False)
plt.show()

На графике ниже изображены три ситуации:

#left plot ('c=' set to 'out', 'cmap=' set to 'Greens')
plt.scatter(num, out, s=50, lw=2, c=out, cmap=plt.cm.Greens, marker='o', vmin=99999)
#central plot ('c=' not set, 'cmap=' not set)
plt.scatter(num, out, s=50, lw=2, marker='o', vmin=99999)
#right plot ('c=' set to 'out', 'cmap=' not set)
plt.scatter(num, out, s=50, lw=2, c=out, marker='o', vmin=99999)

comparison plot

...