簡體   English   中英

如何以密度 plot 有條件地着色?

[英]How do I color conditionally in a density plot?

樣本 我正在嘗試制作密度 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將改善該區域的邊界)。 您可以嘗試對數據進行上采樣,以使插值發生在如此小的距離上,以至於它看起來是一條垂直的直線並且區域看起來是相連的,更多詳細信息請參見此問題的答案如何正確移動區域中的基線 plot到特定的 y 位置並在 Altair 中相應地更改填充顏色? .

另一種解決方案是將中間部分放在整個密度 plot 的頂部:

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

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM