如何使用 Plotly Graph Objects 和 Plotly Express 定义图形中的颜色
- 2025-02-28 08:22:00
- admin 原创
- 91
问题描述:
有很多问题和答案都以某种方式涉及这个主题。通过这篇文章,我想清楚地说明为什么像 这样的简单方法对marker = {'color' : 'red'}
有效plotly.graph_objects (go)
,但color='red'
对 无效,尽管颜色是和plotly.express (px)
的属性。我想说明为什么它不起作用真是太棒了。px.Line
`px.Scatter`
因此,如果px
这是制作 plotly 图形的最简单方法,那么为什么像color='red'
返回错误这样明显的事情
ValueError:“color”的值不是“data_frame”中列的名称。
简而言之,这是因为color
它px
不接受任意的颜色名称或代码,而是接受数据集中的变量名称,以便为唯一值分配颜色循环并将它们显示为具有不同颜色的线条。
让我通过应用gapminderLife 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'] 之一,但收到:red
那么这里发生了什么?
解决方案 1:
首先,如果需要解释go
和px
之间的更广泛差异,请查看这里和这里。如果完全不需要解释,您会在答案的最后找到一个完整的代码片段,它将揭示 plotly.express 中许多带有颜色的幂
第一部分:本质:
乍一看可能并非如此,但有充分的理由说明color='red'
为什么 无法按预期使用px
。但首先,如果您想要做的只是手动为所有标记设置特定颜色,您可以使用.update_traces(marker=dict(color='red'))
Python的链接方法来实现。但首先,让我们看看默认设置:
1.1 Plotly 表达默认值
图1,px默认散点图使用px.Scatter
代码1、px默认散点图使用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")
这里,正如问题中已经提到的,颜色被设置为可通过以下方式获得的默认 plotly 序列中的第一个颜色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. 使用以下命令更改 px 使用的颜色序列:
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'))
第二部分:细节和情节
以下代码片段将生成以下图表,显示各大洲不同 GDP 水平的预期寿命。标记的大小代表不同的人口水平,从一开始就让事情变得更有趣。
图 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. 使用 px 更改颜色序列
color_discrete_sequence=px.colors.qualitative.Alphabet
现在,让我们将颜色序列中的颜色应用Alphabet
到不同的大陆:
2. 使用 color
参数为不同的变量分配不同的颜色
color = 'continent'
如果您和我一样,认为这种特定的颜色序列看起来很舒服但可能有点难以区分,那么您可以将您选择的颜色分配给一个或多个大陆,如下所示:
3. 使用以下颜色自定义一种或多种可变颜色
color_discrete_map={"Asia": 'red'}
这真是太棒了:现在您可以更改序列并为特别有趣的变量选择任何您想要的颜色。但是如果您想为更大的子集分配特定颜色,上述方法可能会有点乏味。因此,您也可以使用字典理解来做到这一点:
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'))
解决方案 2:
go
根据vs px
+ 相关图表的类别 + 它是否接受颜色集作为字符串来确定控制颜色的属性名称可能很麻烦
import plotly.graph_objects as go
>>> dir(go.pie)
[..., Marker, ...]
>>> dir(go.pie.Marker)
[..., colors, ...]
一旦你弄清楚了属性
fig.update_traces(
marker = dict(colors=px.colors.qualitative.Safe)
)
扫码咨询,免费领取项目管理大礼包!