繁体   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