Как отсортировать метки оси Y, разные для каждой строки в моем графике?

strtotime () использует временную метку unix, поэтому она переполняется, если она пытается вычислить годы за пределами 2038 года и возвращается к 1970 году.

Чтобы обойти это, используйте объект DateTime. http://php.net/manual/en/book.datetime.php

Чтобы добавить период времени к объекту DateTime, используйте DateTime :: add, который принимает DateInterval в качестве параметра. http://php.net/manual/en/datetime.add.php http://www.php.net/manual/en/class.dateinterval.php

$date = new DateTime("1980-02-15");
if (method_exists("DateTime", "add")) {
    $date->add(new DateInterval("Y75"));
} else {
    $date->modify("+75 years");
}
echo $date->format("Y-m-d");

3
задан jakevdp 27 February 2019 в 16:33
поделиться

3 ответа

Фасет имеет общие масштабы по умолчанию, но вы можете переопределить разрешение масштаба с помощью свойства разрешения:

import altair as alt
import pandas as pd

df = pd.DataFrame({'label': ['A','A','B','B'],
                   'variable': ['x', 'y', 'x', 'y'],
                   'value':[2,4,3,1]})

alt.Chart(df,title='My Plot').mark_bar().encode(
    alt.Y('label', sort=alt.EncodingSortField(field="value", op="mean", order='descending'), axis=alt.Axis(title='Label')),
    alt.X('value:Q', axis=alt.Axis(format='%', title='Value'))
).facet(
    alt.Row('variable', title='Variable'),
    resolve={"scale": {"y": "independent"}}
)

enter image description here

Обратите внимание, что вы больше не можете использовать сокращенную кодировку строк в Altair 2, поскольку спецификации модулей со строкой / столбцом в Altair 2 (и Vega-Lite 2) не имеют свойства resolve. Теперь мы добавили resolve в Vega-Lite 3, поэтому я думаю, что вы сможете сделать следующее после выхода Altair 3:


df = pd.DataFrame({'label': ['A','A','B','B'],
                   'variable': ['x', 'y', 'x', 'y'],
                   'value':[2,4,3,1]})

alt.Chart(df,title='My Plot', resolve={"scale": {"y": "independent"}}).mark_bar().encode(
    alt.Y('label', sort=alt.EncodingSortField(field="value", op="mean", order='descending'), axis=alt.Axis(title='Label')),
    alt.X('value:Q', axis=alt.Axis(format='%', title='Value')),
    alt.Row('variable', title='Variable')
)
0
ответ дан kanitw 27 February 2019 в 16:33
поделиться

Я пытался использовать фасет, но это не помогло. Я предоставляю код здесь, потому что он может вдохновить решение:

import altair as alt
import pandas as pd

df = pd.DataFrame({'label': ['A','A','B','B'],
               'variable': ['x', 'y', 'x', 'y'],
               'value':[2,4,3,1]})
bar = alt.Chart(df,title='My Plot').mark_bar().encode(
    alt.Y('label', axis=alt.Axis(title='Label'), 
          sort=alt.EncodingSortField(field="value", op="values", order='descending')),
    alt.X('value:Q', axis=alt.Axis(format='d', title='Value')),
    tooltip=[alt.Tooltip('label', title='Label'),
             alt.Tooltip('value:Q', format='d', title='Value'),]
).facet(
    row='variable:O'
)
bar

sort grouped bar chart

Тем не менее порядок строк ['B', 'A'] для переменных x и y. Я надеялся получить ['A', 'B] для переменной y столбчатой ​​диаграммы.

Дальнейшее развитие решения, предоставленного jakevdp, я получаю это:

selector = alt.selection_single(empty='all', fields=['label'])
base = alt.Chart(df, title='My Plot').mark_bar().encode(
    alt.Y('label', axis=alt.Axis(title='Label'), sort=alt.EncodingSortField(field="value", op="sum", order='descending')),
    alt.X('value:Q', axis=alt.Axis(format='d', title='Value')),
    color=alt.condition(selector, alt.value('orange'), alt.value('lightgray')),
    tooltip=[alt.Tooltip('label', title='Label'),
             alt.Tooltip('value:Q', format='d', title='Value'),]
).add_selection(selector)

bar = alt.vconcat(title='My Chart')
for v in df['variable'].unique():
    bar &= base.transform_filter(f"datum.variable == '{v}'").properties(title=f"'{v}'")

bar

grouped bar chart with selector and ordering per chart

0
ответ дан cast42 27 February 2019 в 16:33
поделиться

Конструктивные фазовые диаграммы совместно используют свои оси, поэтому это означает, что при сортировке столбца вы сортируете обе оси по всему набору данных .

Если вы хотите, чтобы у каждой диаграммы была отдельная ось, я считаю, что единственный способ сделать это - вручную отфильтровать набор данных и объединить диаграммы. Вот один из способов сделать это:

import altair as alt
import pandas as pd

df = pd.DataFrame({'label': ['A','A','B','B'],
                   'variable': ['x', 'y', 'x', 'y'],
                   'value':[2,4,3,1]})

base = alt.Chart(df).mark_bar().encode(
  alt.Y('label', axis=alt.Axis(title='Label'), 
        sort=alt.EncodingSortField(field="value", op="sum", order='descending')),
  alt.X('value:Q', axis=alt.Axis(format='d', title='Value')),
  tooltip=[alt.Tooltip('label', title='Label'),
           alt.Tooltip('value:Q', format='d', title='Value'),],
)

alt.vconcat(
  base.transform_filter("datum.variable == 'x'").properties(title='x'),
  base.transform_filter("datum.variable == 'y'").properties(title='y'),
  title='My Chart'
)

enter image description here

0
ответ дан jakevdp 27 February 2019 в 16:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: