Используйте одну фигуру для последнего элемента, другую для всех остальных в диаграмме - PullRequest
3 голосов
/ 10 октября 2019

Есть ли в Altair способ использовать одну фигуру для всех элементов в кадре данных, кроме последнего? У меня есть столбцы данных и столбец категории. Мне бы хотелось, чтобы все категории, кроме одной, отображались с помощью круга, а одна категория - с помощью ромба.

Я понимаю, как задать форму и цветовые диапазоны, но не понимаю, как их настроить. условно на основе данных, только порядок и значения форм / цветов

Это упрощенный пример:


myData = {'category':['Cat 1','Cat 2','Cat 3'], 
          'valueX':['10','20','30'], 
          'valueY':['10','20','30']}

df = pd.DataFrame(data=myData)

alt.Chart(df).mark_point().encode(
  x = 'valueX',
  y = 'valueY',
  shape = alt.Shape('category', scale=alt.Scale(range=['circle','diamond']))
)

Это просто чередование между кругом и ромбом. Как мне сделать, чтобы мои первые две категории использовали кружок, а «Кошка 3» - бриллиант?

Ответы [ 2 ]

3 голосов
/ 11 октября 2019

Свойство scale позволяет сопоставить domain с range, где domain указывает входные значения, а range указывает визуальные свойства, с которыми сопоставлен домен. Если вы хотите, чтобы несколько значений домена отображались на одно и то же значение диапазона, это можно сделать следующим образом:

alt.Chart(df).mark_point().encode(
  x = 'valueX',
  y = 'valueY',
  shape = alt.Shape('category',
    scale=alt.Scale(
      domain=['Cat 1', 'Cat 2', 'Cat 3'],
      range=['circle', 'circle', 'diamond']
    )
  )
)

enter image description here

2 голосов
/ 11 октября 2019

Проблема заключается в том, что согласно грамматике altair кодирование формы будет назначать новую форму каждой категории. Целью кодирования является различие между категориями, поэтому имеет смысл назначить каждой категории новую форму.

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

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

Это проблема с данными (т. Е. Решена с использованием pandas), а не проблема с altair.

В приведенном ниже примере кода я назвал новый столбец shape

import altair as alt
import pandas as pd

myData = {'category':['Cat 1','Cat 2','Cat 3'],
          'shape':['c','c','d'],
          'valueX':['10','20','30'], 
          'valueY':['10','20','30']}

df = pd.DataFrame(data=myData)

alt.Chart(df).mark_point().encode(
  x = 'valueX',
  y = 'valueY',
  shape = alt.Shape('shape', scale=alt.Scale(range=['circle','diamond']))
)

enter image description here

...