簡體   English   中英

如何構建帶雙軸的 Altair 分層圖表?

[英]How to build an Altair layered chart w/ dual axis?

描述

此代碼顯示了三個 Altair 圖表:

  1. scatter
  2. rate
  3. line_plot

目標

目標是將所有圖表組合成具有以下規范的分層圖表:

  • 顯示scatterrate的 y 軸(即雙軸圖表)
  • Series
  • 顯示line_plot

代碼

    import altair as alt
    from vega_datasets import data
    import pandas as pd
    
    source = data.anscombe().copy()
    source['line-label'] = 'x=y'
    source = pd.concat([source,source.groupby('Series').agg(x_diff=('X','diff'), y_diff=('Y','diff'))],axis=1)
    source['rate'] = source.y_diff/source.x_diff
    source['rate-label'] = 'rate of change'
    source['line-label'] = 'line y=x'
    
    source_linear = source.groupby(by=['Series']).agg(x_linear=('X','max'), y_linear=('X', 'max')).reset_index().sort_values(by=['Series'])
    
    source_origin = source_linear.copy()
    source_origin['y_linear'] = 0
    source_origin['x_linear'] = 0
    
    source_linear = pd.concat([source_origin,source_linear]).sort_values(by=['Series'])
    
    source = source.merge(source_linear,on='Series').drop_duplicates()
    
    scatter = alt.Chart(source).mark_circle(size=60, opacity=0.60).encode(
        x=alt.X('X', title='X'),
        y=alt.Y('Y', title='Y'),
        color='Series:N',
        tooltip=['X','Y','rate']
    )
    
    line_plot = alt.Chart(source).mark_line(color= 'black', strokeDash=[3,8]).encode(
        x=alt.X('x_linear', title = ''),
        y=alt.Y('y_linear', title = ''),
        shape = alt.Shape('line-label', title = 'Break Even'),
        color = alt.value('black')
    )
    
    rate =  alt.Chart(source).mark_line(strokeDash=[5,3]).encode(
        x=alt.X('X', title = 'X'),
        y=alt.Y('rate:Q'),
        color = alt.Color('rate-label',),
        tooltip=['rate','X','Y']
    )

當前解決方案

當前解決方案的問題是rate圖表的 y 軸未顯示為雙軸。 有什么建議?

    alt.layer(rate,scatter,line_plot).facet(
        'Series:N'
        , columns=2
    ).resolve_scale(
        x='independent',
        y='independent'
    ).display()

雙軸問題

嗯,我明白了,但這可能不是最好的解決方案。 我遵循了以下鏈接中描述的方法,我們手動對圖表進行了分面:

  1. 刻面螺紋

為了獲得雙軸,我只是在手動步驟中添加了.resolve_scale(y='independent') 下面是解決方案:

import altair as alt
from vega_datasets import data
import pandas as pd

source = data.anscombe().copy()
source\['line-label'\] = 'x=y'
source = pd.concat(\[source,source.groupby('Series').agg(x_diff=('X','diff'), y_diff=('Y','diff'))\],axis=1)
source\['rate'\] = source.y_diff/source.x_diff
source\['rate-label'\] = 'rate of change'
source\['line-label'\] = 'line y=x'

source_linear = source.groupby(by=\['Series'\]).agg(x_linear=('X','max'), y_linear=('X', 'max')).reset_index().sort_values(by=\['Series'\])

source_origin = source_linear.copy()
source_origin\['y_linear'\] = 0
source_origin\['x_linear'\] = 0

source_linear = pd.concat(\[source_origin,source_linear\]).sort_values(by=\['Series'\])

source = source.merge(source_linear,on='Series').drop_duplicates()

scatter = alt.Chart().mark_circle(size=60, opacity=0.60).encode(
    x=alt.X('X', title='X'),
    y=alt.Y('Y', title='Y'),
    color='Series:N',
    tooltip=\['X','Y','rate'\]
)

line_plot = alt.Chart().mark_line(color= 'black', strokeDash=\[3,8\]).encode(
    x=alt.X('x_linear', title = '', axis=None),
    y=alt.Y('y_linear', title = '', axis=None),
    shape = alt.Shape('line-label', title = 'Break Even'),
    color = alt.value('black')
)

rate =  alt.Chart().mark_line(strokeDash=\[5,3\]).encode(
    x=alt.X('X', title = 'X'),
    y=alt.Y('rate:Q'),
    color = alt.Color('rate-label',),
    tooltip=\['rate','X','Y'\]
)

scatter_rate = alt.layer(scatter, rate, data=source)

chart_generator =  (alt.layer(scatter, rate, line_plot, data = source, title=f"{val}: Duplicated Points w/ Line at Y=X").transform_filter(alt.datum.Series == val).resolve_scale(y='independent') \
             for val in source.Series.unique()) 

chart = alt.concat(*(
    chart_generator
), columns=2).display()

在此處輸入圖片說明

暫無
暫無

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

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