Plotly: как определить цвета на фигуре с помощью plotly.graph_objects и plotly.express?
Есть много вопросов и ответов, так или иначе затрагивающих эту тему. В этом материале я хотел бы четко показать, почему такой простой подход, 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'], но получено: красный
Так что здесь происходит?
Ответы
Во-первых, если требуется объяснение более широких различий между 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'))