如何在使用Altair制作hconcat图表时显示两个不同的图例

4

我需要在Jupyterlab中将两个分开的图表并排显示,包括它们的图例,而我唯一能做到的是使用hconcat。 我已经完成了这一步:

enter image description here

然而,即使使用.resolve_legend(color='independent'),我仍然会在顶部的两个图例中显示来自两个图表的条目,这非常令人困惑。
结果应该如下所示:

enter image description here

我该如何删除不需要的图例项?如果有人知道在单个jupyterlab单元格中将两个图表并排显示的好方法,我会很高兴采取不同的路线。
我的代码如下:
import altair as alt
import pandas as pd
from altair.expr import datum
df_test=pd.read_csv("test_df.csv")

chart_m1=alt.Chart(df_test).mark_bar().encode(
            x=alt.X('counts:Q', stack="normalize",axis=None),
            y=alt.Y('category:N',sort=['A','B','C'],title=None),
            color=alt.Color('grade:N',
                sort = alt.EncodingSortField( 'sort:Q', order = 'ascending' ),
                scale = alt.Scale(domain=['good <10', 'average 10-20', 'bad >20'], range=['#0cce6b', '#ffa400', '#ff4e42']),
                legend = alt.Legend(title="Metric1",orient='top')),
            order='sort:Q',
            tooltip=['category:N','grade:N','counts:Q']
            ).transform_filter(datum.metric=='metric1'
            ).properties(height=50,width=150)

chart_m2=alt.Chart(df_test).mark_bar().encode(
            x=alt.X('counts:Q', stack="normalize",axis=None),
            y=alt.Y('category:N',sort=['A','B','C'],title=None),
            color=alt.Color('grade:N',
                sort = alt.EncodingSortField( 'sort:Q', order = 'ascending' ),
                scale = alt.Scale(domain=['good <100', 'average 100-350', 'bad >350'], range=['#0cce6b', '#ffa400', '#ff4e42']),
                legend = alt.Legend(title="Metric2",orient='top')),
            order='sort:Q',
            tooltip=['category:N','grade:N','counts:Q']
            ).transform_filter(datum.metric=='metric2'
            ).properties(height=50,width=150)

alt.hconcat(chart_m1,chart_m2).resolve_legend(color='independent').configure_view(stroke=None)

我使用的test_df.csv如下:

category,metric,sort,grade,counts
A,metric1,1,good <10,345
B,metric1,1,good <10,123
C,metric1,1,good <10,567
A,metric1,2,average 10-20,567
B,metric1,2,average 10-20,678
C,metric1,2,average 10-20,789
A,metric1,3,bad >20,900
B,metric1,3,bad >20,1011
C,metric1,3,bad >20,1122
A,metric2,1,good <100,1122
B,metric2,1,good <100,1011
C,metric2,1,good <100,900
A,metric2,2,average 100-350,789
B,metric2,2,average 100-350,678
C,metric2,2,average 100-350,567
A,metric2,3,bad >350,567
B,metric2,3,bad >350,345
C,metric2,3,bad >350,123
1个回答

11

哈 - 完美,正是我所需要的。谢谢。 - Kristian Sköld

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接