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

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

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

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

4 ответа

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

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()

Или, если вы предпочитаете более широкий диапазон цветовых карт, вы также можете указать 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()

В 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()

Иногда вам может потребоваться построить цвет точно в зависимости от значения x. Например, у вас может быть фрейм данных с 3 типами переменных и некоторыми точками данных. И вы хотите сделать следующее,

  • Точки графика соответствуют физической переменной "А" в КРАСНОМ.
  • Точки графика соответствуют физической переменной "B" синего цвета.
  • Точки графика соответствуют физической переменной 'C' в ЗЕЛЕНОМ.

В этом случае вам, возможно, придется написать короткую функцию, чтобы сопоставить значения x с соответствующими названиями цветов в виде списка, а затем передать этот список plt.scatter команда.

x=['A','B','B','C','A','B']
y=[15,30,25,18,22,13]

# Function to map the colors as a list from the input list of x variables
def pltcolor(lst):
    cols=[]
    for l in lst:
        if l=='A':
            cols.append('red')
        elif l=='B':
            cols.append('blue')
        else:
            cols.append('green')
    return cols
# Create the colors list using the function above
cols=pltcolor(x)

plt.scatter(x=x,y=y,s=500,c=cols) #Pass on the list created by the function here
plt.grid(True)
plt.show()

График разброса окраски как функция переменной x

Довольно простое решение также это:

      fig, ax = plt.subplots(nrows=1, ncols=1, figsize=(8,8)) 

p = ax.scatter(x, y, c=y, cmap='cmo.deep')
fig.colorbar(p,ax=ax,orientation='vertical',label='labelname')
Другие вопросы по тегам