[英]Plotly: How to colorcode plotly graph objects bar chart using Python?
[英]Plotly: How to define colors in a figure using Plotly Graph Objects and Plotly Express?
有许多问题和答案以某种方式涉及到这个主题。 有了这个贡献,我想清楚地说明为什么像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
in px
不接受任意颜色名称或代码,而是接受数据集中的变量名称,以便将颜色循环分配给唯一值并将它们显示为具有不同 colors 的行。
让我通过应用gapminder数据集来演示,并显示截至2007
世界上所有(至少大多数)国家的Life expectancy
与GDP per capita
的散点图。 像下面这样的基本设置将产生以下 plot
go
: 颜色由名为plotly的循环设置,但此处使用marker = {'color': 'red'}
指定
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'
可以解决这个问题:
px
以定义的颜色散布 plot:# 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 中 colors 的许多功能
乍一看似乎并非如此,但有充分的理由说明为什么color='red'
不能像您预期的那样使用px
。 但首先,如果你想做的只是手动为所有标记设置特定颜色,你可以使用.update_traces(marker=dict(color='red'))
多亏了pythons 链接方法。 但首先,让我们看一下默认设置:
px.Scatter
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']
这看起来很不错。 但是,如果您想更改内容甚至同时添加更多信息怎么办?
正如我们已经接触过的px.scatter
, color
属性不接受像red
这样的颜色作为参数。 相反,您可以使用color='continent'
轻松区分数据集中的不同变量。 但是px
中的 colors 还有很多:
结合使用以下六种方法,您可以使用 plotly express完全按照自己的意愿使用 colors。 请记住,您甚至不必选择。 您可以同时使用以下一种、部分或所有方法。 一种特别有用的方法将显示为1
和3
的组合。 但我们稍后会谈到这一点。 这是你需要知道的:
1.更改 px 使用的颜色顺序:
color_discrete_sequence=px.colors.qualitative.Alphabet
2.将不同的 colors 赋值给不同的变量,使用color
参数
color = 'continent'
3.自定义一个或多个变量colors with
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'))
以下代码段将生成下面的 plot,它显示了所有大陆在不同 GDP 水平下的预期寿命。 标记的大小代表不同级别的人口,从 go 开始让事情变得更有趣。
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',
)
为了说明上述方法的灵活性,让我们首先改变颜色顺序。 由于我们一开始只展示了一种类别和一种颜色,您必须等待后续步骤才能看到真正的效果。 但是这里是相同的 plot 现在color_discrete_sequence=px.colors.qualitative.Alphabet
按照步骤 1:
1.改变px使用的颜色序列
color_discrete_sequence=px.colors.qualitative.Alphabet
现在,让我们将Alphabet
颜色序列中的 colors 应用到不同的大陆:
2.将不同的 colors 赋值给不同的变量,使用color
参数
color = 'continent'
如果你和我一样,认为这个特定的颜色序列在眼睛上很容易,但可能有点难以区分,你可以将你选择的颜色分配给一个或多个大陆,如下所示:
3.自定义一个或多个变量colors with
color_discrete_map={"Asia": 'red'}
这非常棒:现在您可以更改顺序并为特别有趣的变量选择您喜欢的任何颜色。 但是如果您想将特定颜色分配给更大的子集,上述方法可能会有点乏味。 所以你也可以通过听写理解来做到这一点:
4.使用字典理解和color_discrete_map
将 colors 分配给一个组
# 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'))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.