Альтаир: Обрезать Log10 ось до желаемого интервала (домен) - PullRequest
2 голосов
/ 27 марта 2020

Используя Altair в Python, возможно ли обрезать ось Log10 по указанному значению? Я хотел бы показать только от 5 до 50 в логарифмическом масштабе.

Ниже приведены мой код и полученное изображение:

import altair as alt
import pandas as pd

from vega_datasets import data
cars = data.cars()

nice = pd.DataFrame([{'x_min': [0],
                    'x_max': [240],
                    'y_min': [5],
                    'y_max': [10]}])

good = pd.DataFrame([{'x_min': [0],
                    'x_max': [240],
                    'y_min': [10],
                    'y_max': [20]}])

bad = pd.DataFrame([{'x_min': [0],
                    'x_max': [240],
                    'y_min': [20],
                    'y_max': [50]}])

mpg_nice_fill = alt.Chart(nice).mark_rect(color= 'green', opacity=0.2).encode(
    x='x_min:Q',
    x2='x_max:Q',
    y='y_min:Q',
    y2='y_max:Q'
)

mpg_good_fill = alt.Chart(good).mark_rect(color= 'yellow', opacity=0.2).encode(
    x='x_min:Q',
    x2='x_max:Q',
    y='y_min:Q',
    y2='y_max:Q'
)

mpg_bad_fill = alt.Chart(bad).mark_rect(color= 'red', opacity=0.2).encode(
    x='x_min:Q',
    x2='x_max:Q',
    y='y_min:Q',
    y2='y_max:Q'
)

chart = alt.Chart(cars).mark_point().encode(
    x='Horsepower',
    y= alt.Y('Miles_per_Gallon', scale= alt.Scale(type= 'log')),
    color='Origin',
)

alt.layer(chart + mpg_nice_fill + mpg_good_fill + mpg_bad_fill + chart
         )

enter image description here

Это, вероятно, научно правильно, но я думаю, что удаление белой области (< 5 mpg и > 50 mpg доменов) сделало бы меня эстетически лучше. Однако domain = (5, 50) в alt.Y() не работает для меня.

1 Ответ

2 голосов
/ 27 марта 2020

Аргумент домена работает с масштабами журнала, но домены должны начинаться и заканчиваться на целочисленных степенях основания, а другие значения будут округлены до следующей целочисленной степени.

Например, здесь по умолчанию домен base-10:

import altair as alt
import pandas as pd

data = pd.DataFrame({'x': [1, 10, 100]})

alt.Chart(data).mark_point().encode(
    x=alt.X('x', scale=alt.Scale(type='log'))
)

enter image description here

Вот домен base-2 с ограничениями, установленными в 1 и 256:

alt.Chart(data).mark_point().encode(
    x=alt.X('x', scale=alt.Scale(type='log', base=2, domain=[1, 256]))
)

enter image description here

К сожалению, Vega-Lite не предоставляет никакого способа установить домены журналов нецелыми степенями основания.

Для ваша диаграмма выше, логарифмическая шкала base-2 между 8 и 64 может быть хорошей подгонкой:

alt.Chart(cars).mark_point().encode(
    x='Horsepower',
    y= alt.Y('Miles_per_Gallon', scale= alt.Scale(type= 'log', base=2, domain=[8, 64])),
    color='Origin',
)

enter image description here

...