Altair 散点图添加了不需要的线条
Posted
技术标签:
【中文标题】Altair 散点图添加了不需要的线条【英文标题】:Altair Scatterplot adds unwanted lines 【发布时间】:2021-01-19 17:53:54 【问题描述】:在热图上方分层时,Altair 散点图似乎仅在点值也在热图的轴上时才有效。在任何其他情况下,沿 x 和 y 值添加白线。这是一个最小的例子:
import streamlit as st
import altair as alt
import numpy as np
import pandas as pd
# Compute x^2 + y^2 across a 2D grid
x, y = np.meshgrid(range(-5, 5), range(-5, 5))
z = x ** 2 + y ** 2
# Convert this grid to columnar data expected by Altair
source = pd.DataFrame('x': x.ravel(),
'y': y.ravel(),
'z': z.ravel())
c = alt.Chart(source).mark_rect().encode(
x='x:O',
y='y:O',
color='z:Q'
)
scatter_source = pd.DataFrame('x': [-1.001,-3], 'y': [0,1])
s = alt.Chart(scatter_source).mark_circle(size=100).encode(
x='x:O',
y='y:O')
st.altair_chart(c + s)
有没有办法防止这种行为?我想稍后为这些点设置动画,因此不能向热图轴添加值。
【问题讨论】:
【参考方案1】:序数编码(标记为:O
)将始终创建一个离散轴,每个唯一值都有一个bin。听起来您希望使用定量编码(标记为 :Q
)来可视化您的数据,这会创建一个连续的实值轴。
但是,在热图的情况下,这会使事情变得复杂:如果您不再将数据视为有序类别,则必须指定沿每个轴的每个 bin 的起点和终点。这需要考虑一下您的 bin 代表什么:值“2”是否代表从 2 到 3 的数字?从1到2?从 1.5 到 2.5?答案将取决于上下文。
以下是使用calculate transform 计算这些 bin 边界的示例,假设这些值表示单元 bin 的中心:
c = alt.Chart(source).transform_calculate(
x1=alt.datum.x - 0.5,
x2=alt.datum.x + 0.5,
y1=alt.datum.y - 0.5,
y2=alt.datum.y + 0.5,
).mark_rect().encode(
x='x1:Q', x2='x2:Q',
y='y1:Q', y2='y2:Q',
color='z:Q'
).properties(
width=400, height=400
)
scatter_source = pd.DataFrame('x': [-1.001,-3], 'y': [0,1])
s = alt.Chart(scatter_source).mark_circle(size=100).encode(
x='x:Q',
y='y:Q'
)
st.altair_chart(c + s)
或者,如果您希望这种分箱更自动地发生,您可以在每个轴上使用分箱变换:
c = alt.Chart(source).mark_rect().encode(
x=alt.X('x:Q', bin=True),
y=alt.Y('y:Q', bin=True),
color='z:Q'
).properties(
width=400,
height=400
)
scatter_source = pd.DataFrame('x': [-1.001,-3], 'y': [0,1])
s = alt.Chart(scatter_source).mark_circle(size=100).encode(
x='x:Q',
y='y:Q'
)
【讨论】:
感谢您的回答!我选择了第二种方法,因为在您的第一个示例中我无法摆脱有些多余的网格框架。此外,您可以执行 bin=alt.Bin(step=0.1) 之类的操作来保持对自动分箱的更多控制。以上是关于Altair 散点图添加了不需要的线条的主要内容,如果未能解决你的问题,请参考以下文章