图表中的最后一个元素使用一种形状,图表中的所有其他形状使用另一种形状

时间:2019-10-10 19:24:13

标签: python altair

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']))
)

这只是在圆圈和菱形之间交替。我如何使我的前两个类别使用圆圈,而“ Cat 3”使用菱形?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

问题是根据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