如何解决如何在密度图中有条件地着色?
我正在尝试绘制密度图并根据 X 值标记该区域的一部分。以下代码段主要有效,但在区域之间有一个奇怪的角度截止。我该如何解决?
np.random.seed(0)
df = pd.DataFrame({'x': np.random.normal(size=1000)})
(alt.Chart(df).
transform_density('x',as_=['val','density']).
transform_calculate(crit='(datum.val < -1.96) | (datum.val > 1.96)').
mark_area().encode(
x='val:Q',y=alt.Y('density:Q',impute={'value': 0}),color='crit:N'
)
)
解决方法
发生这种情况是因为区域标记尝试从蓝色和橙色区域结束的位置到区域的每个部分的 x 轴底部进行线性插值。如果您设置 interpolate='step'
,您将看到边界很清晰(删除 impute
将改善该区域的边界)。您可以尝试对数据进行上采样,以使插值发生在如此小的距离上,以至于它看起来是一条垂直的直线,并且这些区域看起来是相连的,此问题的答案中有更多详细信息 How to correctly shift the baseline in an area plot to a particular y location and change the fill color correspondingly,in Altair? .
另一种解决方案是将中间部分放在整个密度图的顶部:
import numpy as np
import pandas as pd
import altair as alt
np.random.seed(0)
df = pd.DataFrame({'x': np.random.normal(size=1000)})
chart = (
alt.Chart(df)
.transform_density('x',as_=['x','density'])
.mark_area(color='coral')
.encode(x='x',y=alt.Y('density:Q')))
chart + (
chart
.mark_area(color='steelblue')
.transform_filter('(datum.x > -1.96) & (datum.x < 1.96)'))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。