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

152

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

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

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

Томас Коллетт
источник

Ответы:

156

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

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

введите описание изображения здесь

Или, если вы предпочитаете более широкий диапазон цветовых карт , вы также можете указать cmapkwarg для 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()
Джо Кингтон
источник
1
Спасибо! Есть ли в любом случае нарисовать контуры вокруг этих точек, содержащих определенное количество общего веса?
Томас Коллетт
6
mpl.cmтакже доступен напрямую как plt.cm.
Хелтонбайкер
@ Томас Коллет: Если вы хотите нарисовать контуры, вам нужно будет интерполировать данные из точек в 2D матрицу, а затем построить график, используя plt.contour()или plt.contourf()- но это другой вопрос
Зак
Как вы можете добавить ярлык в легенду? В этом случае с непрерывными числами, я подозреваю, вы бы использовали цветную полосу. Как насчет в случае дискретных значений? Например, могу ли я добавить 3 ярлыка в легенду для моих трех категорий?
Nate
26

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

введите описание изображения здесь

Хоакин
источник
3
Для записи вы можете применить ALPHA в качестве цветовой карты, если в качестве cаргумента укажите массив (n, 4) со значениями альфа в четвертом столбце. Если третья переменная Z, с shape=(n,1), то colors = numpy.hstack((numpy.zeros_like(z), numpy.zeros_like(z), numpy.ones_like(z), z/z.max()))дает очень хороший эффект (конечно, он может быть изменен).
Хелтонбайкер
Я получаю сообщение об ошибке: «длина последовательности rgba должна быть 3 или 4»
MattCochrane
1
@MattClimbs Я подозреваю, что вы вызываете plt.plot, а не plt.scatter, как в примере.
smashbro
Как вы добавляете цветную полосу к этому графику?
FaCoffee
2
@FaCoffee plt.colorbar()сделает это
Мэтью Сэвидж
10

Иногда вам может потребоваться построить график цвета точно в зависимости от значения 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

Tirtha
источник
Как создать цветную полосу для этого сюжета?
Марьям Рахмани Могаддам