在Altair图中更改单个颜色。

4

有没有办法在Altair图表中仅更改单个组的颜色,而保持其余部分不变?我喜欢默认的颜色方案,但是有一个组我想要更改颜色。

例如,在像这样的散点图中:

import altair as alt
from vega_datasets import data

iris = data.iris()

alt.Chart(iris).mark_point().encode(
    x='petalWidth',
    y='petalLength',
    color=alt.Color('species')
)

example_scatterplot

我希望将“versicolor”的颜色更改为黑色,而不更改其余部分。
我从文档中了解到,您可以指定自己的颜色方案,或为每个组分配颜色,如下所示:
domain = ['setosa', 'versicolor', 'virginica']
range_ = ['red', 'green', 'blue']

alt.Chart(iris).mark_point().encode(
    x='petalWidth',
    y='petalLength',
    color=alt.Color('species', scale=alt.Scale(domain=domain, range=range_))
)

example_scatterplot_2

但我找不到一种简单的方法来改变一个物种的颜色而不影响其余颜色。

如果你想把绿色改成黑色,可以使用以下对应关系,这是你想要的吗?range_ = ['red', 'black', 'blue'] - r-beginners
不太对。我想把绿色改成黑色,同时保持其他颜色与原始颜色完全相同。我意识到一个解决方案是找到这些确切色调的名称,然后像你建议的那样更改列表,但我希望有一种方法可以避免手动执行该操作,因为我正在使用的真实DataFrame具有相当多的组。 - Antton Lamarca
例如,您是否打算创建一个具有指定颜色的图形,将图形对象转换为字典格式,从生成的字典中重写颜色,然后将字典转换回图形对象? chart = alt.Chart(...); graph = chart.to_dict(); graph ['encoding'] ['color'] ['scale'] ['range'] [1] ='black'; alt.Chart.from_dict(graph) - r-beginners
这仍然需要先定义“规模”和“范围”。第一个示例中,由图表对象制作的字典没有这些条目。 - Antton Lamarca
你接受的答案是否符合问题的意图? - r-beginners
1个回答

2
一种方法是使用alt.condition,尽管更新后的颜色不会显示在图例中:
import altair as alt
from vega_datasets import data

iris = data.iris()

alt.Chart(iris).mark_point().encode(
    x='petalWidth',
    y='petalLength',
    color=alt.condition("datum.species == 'setosa'", alt.value('yellow'), alt.Color('species'))
)

enter image description here

如果您想改变颜色并且在图例中反映出来,唯一的方法是像您在问题中所做的那样使用自定义比例尺。

是否可能将图例中显示的颜色单独更改为相同的颜色?无论如何,这对我现在来说是一个足够好的解决方案。谢谢! - Antton Lamarca
1
图例总是反映比例尺的颜色,因此改变图例中的颜色的方法是按照你在问题中展示的方式改变比例尺中的颜色。 - jakevdp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接