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”使用菱形?
答案 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']
)
)
)
答案 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']))
)