Altair:将配色方案与对数刻度配合使用

时间:2018-10-20 13:38:40

标签: python numpy altair

我是Altair的新手,我正尝试制作一个带有对数刻度的颜色热图,并选择一个非默认的配色方案(默认方案使用的范围很少,而且我也希望使用-暗色)。我发现使用type=log可以轻松获得对数刻度,但是一旦执行此操作,就将忽略scheme=参数。如果我改用range=手动设置高和低颜色,则效果很好。

我进一步发现,如果我以任何方式显式设置type=,甚至显式设置type='linear'(这是默认设置),那么scheme=都会被忽略。这是错误吗?如果没有,我如何才能以某种合理的方式理解配色方案的使用?如果我不能直接使用方案,该如何检查方案并提取其颜色值以重复使用?

以下是一些示例:

import numpy as np
import pandas as pd
import altair as alt

# This question is about Altair - plotnine is only here for the example data
from plotnine.data import diamonds

# This works, and gives me the greenblue color scheme:
alt.Chart(diamonds).mark_rect().encode(
    x=alt.X('carat',bin=True),
    y=alt.Y('price',bin=True),
    color=alt.Color('count()',scale=alt.Scale(scheme='greenblue'))
)

# This gives me a log scale, but now the greenblue scheme is gone:
alt.Chart(diamonds).mark_rect().encode(
    x=alt.X('carat',bin=True),
    y=alt.Y('price',bin=True),
    color=alt.Color('count()',scale=alt.Scale(type='log',scheme='greenblue'))
)

# Direct specification of range works, but it is not exactly the same
# colors as greenblue.  If this is the only way to do it, how do I open
# up the greenblue scheme and grab its colors?
alt.Chart(diamonds).mark_rect().encode(
    x=alt.X('carat',bin=True),
    y=alt.Y('price',bin=True),
    color=alt.Color('count()',scale=alt.Scale(type='log',range=['palegreen','blue']))
)

1 个答案:

答案 0 :(得分:3)

我认为这一定是一个错误。我在github上找不到此问题的位置,此问题已得到修复,但是您发布的代码现在似乎可以正常工作。我正在运行atair版本'3.2.0'

import numpy as np
import pandas as pd
import altair as alt

from plotnine.data import diamonds

# Added to alleviate the large dataset issues  
alt.data_transformers.enable('json')

alt.Chart(diamonds).mark_rect().encode(
    x=alt.X('carat',bin=True),
    y=alt.Y('price',bin=True),
    color=alt.Color('count()',scale=alt.Scale(scheme='greenblue'))
)

enter image description here

alt.Chart(diamonds).mark_rect().encode(
    x=alt.X('carat',bin=True),
    y=alt.Y('price',bin=True),
    color=alt.Color('count()',scale=alt.Scale(type='log',scheme='greenblue'))
)

enter image description here