如何在密度图中有条件地着色?
How do I color conditionally in a density plot?
我正在尝试绘制密度图并根据 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
会改善该区域的边界)。您可以尝试对数据进行上采样,以便在如此短的距离内进行插值,使其看起来像一条垂直直线,并且这些区域看起来是相连的,更多详细信息请参见此问题的答案 .
另一种解决方案是将中间部分叠加在整个密度图的顶部:
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)'))
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
会改善该区域的边界)。您可以尝试对数据进行上采样,以便在如此短的距离内进行插值,使其看起来像一条垂直直线,并且这些区域看起来是相连的,更多详细信息请参见此问题的答案
另一种解决方案是将中间部分叠加在整个密度图的顶部:
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)'))