Matplotlib scatterplot; цвет как функция третьей переменной

Я хочу сделать диаграмму рассеяния (используя matplotlib), где точки затенены в соответствии с третьей переменной. Я очень близко к этому:

plt.scatter(w, M, c=p, marker='s')

где w и M - точки данных, а p - переменная, которую я хочу затенять относительно.
Однако я хочу сделать это в оттенках серого, а не в цвете. Может ли кто-нибудь помочь?

Ответ 1

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

import numpy as np
import matplotlib.pyplot as plt

# Generate data...
x = np.random.random(10)
y = np.random.random(10)

# Plot...
plt.scatter(x, y, c=y, s=500)
plt.gray()

plt.show()

enter image description here

Или, если вы предпочитаете более широкий диапазон цветовых кодов, вы также можете указать cmap kwarg scatter. Чтобы использовать обратную версию любого из них, просто укажите версию "_r" любого из них. Например. gray_r вместо gray. Существует несколько различных цветовых колонок в оттенках серого, сделанных заранее (например, gray, gist_yarg, binary и т.д.).

import matplotlib.pyplot as plt
import numpy as np

# Generate data...
x = np.random.random(10)
y = np.random.random(10)

plt.scatter(x, y, c=y, s=500, cmap='gray')
plt.show()

Ответ 2

В matplotlib серые цвета могут быть заданы как строка числового значения между 0-1.
Например c = '0.1'

Затем вы можете преобразовать свою третью переменную в значение внутри этого диапазона и использовать ее для окраски ваших очков.
В следующем примере я использовал y-позицию точки как значение, определяющее цвет:

from matplotlib import pyplot as plt

x = [1, 2, 3, 4, 5, 6, 7, 8, 9]
y = [125, 32, 54, 253, 67, 87, 233, 56, 67]

color = [str(item/255.) for item in y]

plt.scatter(x, y, s=500, c=color)

plt.show()

enter image description here