цвет графика рассеяния matplotlib как функция третьей переменной

Я хотел бы знать, как сделать цветовые точки функции разброса matplotlib третьей переменной.

Вопросовgnuplot переменная linecolor в matplotlib? а такжеMatplotlib scatterplot; цвет как функция третьей переменной ставил похожие запросы, однако ответы на эти вопросы не решают мою проблему: использованиеc=arraywhichspecifiespointcolour в функции разброса задается только цвет заливки, а не цвет края. Это означает, что использованиеc=arr... не удается при использованииmarkersymbol='+'Например, (потому что этот маркер не имеет заливки, только ребра). Я хочу, чтобы точки были надежно окрашены третьей переменной, независимо от того, какой символ используется.

Есть ли способ достичь этого с помощью функции рассеяния Matplotlib?

 Warren Weckesser19 окт. 2012 г., 02:41
@Avaris: У меня тоже работает. Я обновил свой ответ соответственно.
 Avaris19 окт. 2012 г., 02:30
Я краснею+ символы, когда я установилmarker='+'.

Ответы на вопрос(1)

Это работает для меня, используя Matplotlib 1.1:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(10)
y = np.sin(x)

plt.scatter(x, y, marker='+', s=150, linewidths=4, c=y, cmap=plt.cm.coolwarm)
plt.show()

Результат:

В качестве альтернативы, для n точек создайте массив значений цвета RGB с формой (n, 3) и назначьте егоedgecolors Ключевой аргументscatter():

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 20, 100)
y = np.sin(x)
z = x + 20 * y

scaled_z = (z - z.min()) / z.ptp()
colors = plt.cm.coolwarm(scaled_z)

plt.scatter(x, y, marker='+', edgecolors=colors, s=150, linewidths=4)
plt.show()

Результат:

Этот пример получает значения RGBA путем масштабированияz значения в диапазоне [0,1] и вызов цветовой картыplt.cm.coolwarm с масштабированными значениями. Когда вызывается таким образом, таблица цветов matplotlib возвращает массив значений RGBA, где в каждой строке указывается цвет соответствующего входного значения. Например:

>>> t = np.linspace(0, 1, 5)
>>> t
array([ 0.  ,  0.25,  0.5 ,  0.75,  1.  ])
>>> plt.cm.coolwarm(t) 
array([[ 0.2298,  0.2987,  0.7537,  1.    ],
       [ 0.5543,  0.6901,  0.9955,  1.    ],
       [ 0.8674,  0.8644,  0.8626,  1.    ],
       [ 0.9567,  0.598 ,  0.4773,  1.    ],
       [ 0.7057,  0.0156,  0.1502,  1.    ]])
 user108293019 окт. 2012 г., 04:45
Спасибо, Уоррен, за твой ответ. К сожалению, ваш первый пример приводит к черным плюсам для меня. Я не знаю почему. mpl .__ version__ выдает 1.0.1, если это актуально. Возможно, мне придется попробовать передать 'edgecolors' список rgbs, но это означает, что мне нужно создавать их из значений 'z' и карты цветов вручную, верно?
 Warren Weckesser19 окт. 2012 г., 05:24
Я использую версию 1.1. Были некоторые изменения в коде маркера между 1.0 и 1.1, так что это может быть проблемой. Я обновил второй пример, чтобы показать один способ сопоставления значений 'z' с цветами (но я не пробовал это в matplotlib 1.0).
 user108293013 нояб. 2012 г., 10:32
Привет Уоррен. Просто чтобы развить это, когда я использую более новую (1.1) версию matplotlib, я действительно получаю цветные точки с точно таким же кодом. Вопрос считается решенным. Спасибо!
 mjp13 февр. 2017 г., 18:32
Если вы используетеPython 2.7 не забудьте использовать:from __future__ import division илиcolors массив будет все нули (из-за округления вниз)

Ваш ответ на вопрос