Plotly: как определить цвета на фигуре с помощью plotly.graph_objects и plotly.express?

Aug 17 2020

Есть много вопросов и ответов, так или иначе затрагивающих эту тему. В этом материале я хотел бы четко показать, почему такой простой подход, marker = {'color' : 'red'}который работает plotly.graph_objects (go), но color='red'не работает, plotly.express (px)хотя цвет является атрибутом обоих px.Lineи px.Scatter. И я хотел бы продемонстрировать, почему это круто, что это не так.


Итак, если pxпредполагается, что это самый простой способ сделать фигуру сюжетной , тогда почему что-то столь очевидное, как color='red'возврат ошибки

ValueError: значение 'color' не является именем столбца в 'data_frame'.

Позвольте мне продемонстрировать на applyig Gapminder набор данных и показать диаграмму рассеяния Life expectancyпротив GDP per capitaвсех (по крайней мере , большинства ) стран по всему миру , как о 2007. Базовая установка, как показано ниже, даст следующий график

Рисунок 1, график с использованием go:

Цвет задается циклом с именем plotly, но здесь указывается с помощью marker = {'color' : 'red'}

Рисунок 2, код:

import plotly.graph_objects as go

df = px.data.gapminder()
df=df.query("year==2007")

fig = go.Figure()
fig.add_traces(go.Scatter(x=df['gdpPercap'], y=df["lifeExp"],
                          mode = 'markers',
                          marker = {'color' : 'red'}
                         ))
fig.show()

Итак, давайте попробуем это pxи предположим, что это color='red'поможет:

Код 2, попытка построения диаграммы рассеяния с заданным цветом с использованием px:

# imports
import plotly.express as px
import pandas as pd

# dataframe
df = px.data.gapminder()
df=df.query("year==2007")

# plotly express scatter plot
px.scatter(df, x="gdpPercap", y="lifeExp",
           color = 'red',
          )

Результат:

ValueError: значение 'color' не является именем столбца в 'data_frame'. Ожидается одно из ['country', 'continent', 'year', 'lifeExp', 'pop', 'gdpPercap', 'iso_alpha', 'iso_num'], но получено: красный

Так что здесь происходит?

Ответы

7 vestland Aug 18 2020 at 00:22

Во-первых, если требуется объяснение более широких различий между goи px, пожалуйста, взгляните здесь и здесь . И если абсолютно никаких объяснений не требуется, вы найдете полный фрагмент кода в самом конце ответа, который раскроет многие возможности с помощью цветов в plotly.express


Часть 1: Суть:

Поначалу может показаться, что это не так, но есть очень веские причины, по которым color='red'он не работает так, как вы могли ожидать px. Но в первую очередь, если все , что вы хотели бы сделать это вручную установить определенный цвет для всех маркеров вы можете сделать это , используя .update_traces(marker=dict(color='red'))благодаря питонам метода построения цепочки . Но сначала давайте посмотрим на глухие настройки:

1.1 Графически выразить значения по умолчанию

Рисунок 1, диаграмма рассеяния по умолчанию в пикселях с использованием px.Scatter

Код 1, диаграмма рассеяния по умолчанию в пикселях с использованием px.Scatter

# imports
import plotly.express as px
import pandas as pd

# dataframe
df = px.data.gapminder()
df=df.query("year==2007")

# plotly express scatter plot
px.scatter(df, x="gdpPercap", y="lifeExp")

Здесь, как уже упоминалось в вопросе, цвет устанавливается как первый цвет в последовательности построения графика по умолчанию, доступной через px.colors.qualitative.Plotly:

['#636EFA', # the plotly blue you can see above
 '#EF553B',
 '#00CC96',
 '#AB63FA',
 '#FFA15A',
 '#19D3F3',
 '#FF6692',
 '#B6E880',
 '#FF97FF',
 '#FECB52']

И это выглядит неплохо. Но что, если вы хотите что-то изменить и даже добавить больше информации одновременно?

1.2: Как изменить настройки по умолчанию и сделать то, что вы хотите, с цветами px:

Как мы уже говорили px.scatter, colorатрибут не принимает цвет как redаргумент. Скорее, вы можете, например, использовать, color='continent'чтобы легко различать разные переменные в наборе данных. Но цвета - это гораздо больше px:


Сочетание шести следующих методов позволит вам делать с цветами именно то , что вы хотите, с помощью plotly express. Имейте в виду, что вам даже не нужно выбирать . Вы можете использовать один , несколько или все перечисленные ниже методы одновременно. И один конкретный полезный подход проявится как комбинация 1и 3. Но мы вернемся к этому чуть позже. Вот что вам нужно знать:

1. Измените цветовую последовательность, используемую в пикселях:

color_discrete_sequence=px.colors.qualitative.Alphabet

2. Назначьте разные цвета разным переменным с помощью color аргумента

color = 'continent'

3. настроить один или несколько переменных цветов с помощью

color_discrete_map={"Asia": 'red'}

4. Легко группируйте большее подмножество переменных, используя понимание слов иcolor_discrete_map

subset = {"Asia", "Africa", "Oceania"}
group_color = {i: 'red' for i in subset}

5. Установите непрозрачность с помощью rgba()цветовых кодов.

color_discrete_map={"Asia": 'rgba(255,0,0,0.4)'}

6. Отмените все настройки с помощью:

.update_traces(marker=dict(color='red'))

Часть 2: Детали и сюжеты

Следующий фрагмент кода представляет собой график, показывающий ожидаемую продолжительность жизни на всех континентах при различных уровнях ВВП. Размер маркеров представляет разные уровни населения, чтобы с самого начала сделать вещи более интересными.

Сюжет 2:

Код 2:

import plotly.express as px
import pandas as pd

# dataframe, input
df = px.data.gapminder()
df=df.query("year==2007")

px.scatter(df, x="gdpPercap", y="lifeExp",
           color = 'continent',
           size='pop',
          )

Чтобы проиллюстрировать гибкость описанных выше методов, давайте сначала просто изменим последовательность цветов . Поскольку мы для начала показываем только одну категорию и один цвет, вам придется подождать следующих шагов, чтобы увидеть реальные эффекты. Но вот тот же график, color_discrete_sequence=px.colors.qualitative.Alphabetчто и в шаге 1:

1. Измените цветовую последовательность, используемую пикселем, с помощью

color_discrete_sequence=px.colors.qualitative.Alphabet

Теперь давайте применим цвета из Alphabetцветовой последовательности к разным континентам:

2. Назначьте разные цвета разным переменным с помощью color аргумента

color = 'continent'

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

3. настроить один или несколько переменных цветов с помощью

color_discrete_map={"Asia": 'red'}

И это довольно здорово: теперь вы можете изменить последовательность и выбрать любой цвет для особо интересных переменных. Но описанный выше метод может оказаться немного утомительным, если вы хотите назначить определенный цвет большему подмножеству. Итак, вот как вы можете сделать это с пониманием dict :

4. Назначьте цвета группе, используя понимание слов иcolor_discrete_map

# imports
import plotly.express as px
import pandas as pd

# dataframe
df = px.data.gapminder()
df=df.query("year==2007")

subset = {"Asia", "Europe", "Oceania"}
group_color = {i: 'red' for i in subset}

# plotly express scatter plot
px.scatter(df, x="gdpPercap", y="lifeExp",
           size='pop',
           color='continent',
           color_discrete_sequence=px.colors.qualitative.Alphabet,
           color_discrete_map=group_color
          )

5. Установите непрозрачность с помощью rgba()цветовых кодов.

А теперь сделаем шаг назад. Если вы считаете, что redподходит для Азии, но, возможно, слишком сильно, вы можете настроить непрозрачность, используя rgbaцвет, например 'rgba(255,0,0,0.4)':

Полный код для последнего сюжета:

import plotly.express as px
import pandas as pd

# dataframe, input
df = px.data.gapminder()
df=df.query("year==2007")

px.scatter(df, x="gdpPercap", y="lifeExp",
           color_discrete_sequence=px.colors.qualitative.Alphabet,
           color = 'continent',
           size='pop',
           color_discrete_map={"Asia": 'rgba(255,0,0,0.4)'}
          )

И если вы думаете, что сейчас мы стали слишком сложными, вы можете снова изменить все настройки следующим образом:

6. Отмените все настройки с помощью:

.update_traces(marker=dict(color='red'))

И это возвращает нас к тому, с чего мы начали. Надеюсь, вы найдете это полезным!

Полный фрагмент кода со всеми доступными параметрами:

# imports
import plotly.express as px
import pandas as pd

# dataframe
df = px.data.gapminder()
df=df.query("year==2007")

subset = {"Asia", "Europe", "Oceania"}
group_color = {i: 'red' for i in subset}

# plotly express scatter plot
px.scatter(df, x="gdpPercap", y="lifeExp",
           size='pop',
           color='continent',
           color_discrete_sequence=px.colors.qualitative.Alphabet,
           #color_discrete_map=group_color
           color_discrete_map={"Asia": 'rgba(255,0,0,0.4)'}
          )#.update_traces(marker=dict(color='red'))