有许多问题和答案以某种方式涉及到该主题。通过此贡献,我想清楚地说明为什么marker = {'color' : 'red'}
这样的简单方法对plotly.graph_objects (go)
有用,而color='red'
对plotly.express (px)
却不起作用,尽管颜色是px.Line
和px.Scatter
。 还有 我想证明为什么它很棒。
因此,如果假设px
是easiest way to make a plotly figure,那么为什么像color='red'
这样明显的东西会返回错误
ValueError:“ color”的值不是“ data_frame”中列的名称。
让我通过applyig演示一个gapminder数据集,并显示世界上所有(至少 个)国家的Life expectancy
与GDP per capita
的散点图2007
中的。如下所示的基本设置将产生以下图
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
使用定义的颜色散点图:# 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'。预期为['国家/地区,'大陆','年份', 'lifeExp','pop','gdpPercap','iso_alpha','iso_num'],但收到: 红色
那么这是怎么回事?
答案 0 :(得分:4)
首先,如果需要解释go
和px
之间的广泛差异,请查看here和here。而且,如果绝对不需要解释,您将在答案的最后找到完整的代码段,该代码段将在plotly.express
乍看起来似乎并非如此,但是有很多理由使color='red'
不能像您期望的那样使用px
来工作。但是首先,如果您想做的只是manually set a particular color for all markers,则感谢pythons chaining method,您可以使用.update_traces(marker=dict(color='red'))
。但首先,让我们看看默认设置:
px.Scatter
的px默认散点图px.Scatter
的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")
在这里,正如问题中已经提到的那样,该颜色被设置为通过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
中的颜色还有很多:
以下六种方法的组合将使您可以
精确地 使用色绘表示的颜色。请记住,您甚至不必 选择 。您可以同时使用以下 one , some 或 all 中的所有方法。一种特别有用的方法将显示为1
和3
的组合。但是,我们稍后会谈到。这是您需要知道的:
1。 使用以下命令更改px使用的颜色顺序:
color_discrete_sequence=px.colors.qualitative.Alphabet
2。 用 color
参数
color = 'continent'
3。 使用
自定义一种或多种可变颜色。color_discrete_map={"Asia": 'red'}
4。 使用dict理解和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水平下的预期寿命。标记的大小代表不同层次的人群,使事情一开始就变得更加有趣。
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',
)
为说明上述方法的灵活性,首先让我们 更改颜色顺序 。由于我们刚开始只显示 one 类别和 one 颜色,因此您必须等待后续步骤才能看到实际效果。但是现在这与步骤1中的color_discrete_sequence=px.colors.qualitative.Alphabet
相同:
1。 通过
更改px使用的颜色顺序color_discrete_sequence=px.colors.qualitative.Alphabet
现在,让我们将Alphabet
颜色序列中的颜色应用于不同的大陆:
2。 用 color
参数
color = 'continent'
如果您像我一样认为这种特殊的颜色顺序在眼中很容易但是可能无法区分,则可以将您选择的颜色分配给一个或多个大洲,如下所示:
3。 使用
自定义一种或多种可变颜色。color_discrete_map={"Asia": 'red'}
这非常棒:现在,您可以更改顺序并选择任何颜色,以获得特别有趣的变量。但是,如果您想为更大的子集分配特定的颜色,上述方法可能会变得有些乏味。因此,您也可以使用dict comprehension来做到这一点:
4。。使用dict理解和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'))