在 Altair 的分组和堆叠条形图中为每个组使用单独的比例尺
Using separate scales for each group in a grouped and stacked barplots in Altair
我想在 Python.
中使用 Altair 在分组和堆叠的条形图中为每个组使用单独的比例尺
所以例如而不是下面的
我想要类似于以下内容的内容。在这张(Gimp)编辑过的图片中,我对所有 4 组 A、B、C 和 D 都使用了相同的比例。但是在我的实际数据中,不同组的数量级不同。所以每个Group应该有不同的scale。关于如何做到这一点有什么想法吗?
这是来自 HERE
的最小示例
import pandas as pd
import numpy as np
import altair as alt
df1=pd.DataFrame(10*np.random.rand(4,3),index=["A","B","C","D"],columns=["I","J","K"])
df2=pd.DataFrame(10*np.random.rand(4,3),index=["A","B","C","D"],columns=["I","J","K"])
df3=pd.DataFrame(10*np.random.rand(4,3),index=["A","B","C","D"],columns=["I","J","K"])
def prep_df(df, name):
df = df.stack().reset_index()
df.columns = ['c1', 'c2', 'values']
df['DF'] = name
return df
df1 = prep_df(df1, 'DF1')
df2 = prep_df(df2, 'DF2')
df3 = prep_df(df3, 'DF3')
df = pd.concat([df1, df2, df3])
chart = alt.Chart(df).mark_bar().encode(
x=alt.X('c2:N', title=None),
y=alt.Y('sum(values):Q', axis=alt.Axis(grid=False, title=None)),
column=alt.Column('c1:N', title=None),
color=alt.Color('DF:N', scale=alt.Scale(range=['#96ceb4', '#ffcc5c','#ff6f69']))
).configure_view(
strokeOpacity=0
)
chart.save("Power.svg")
您可以通过添加
为图表设置独立的坐标轴
resolve_scale(y='independent')
请注意,这本身可以让每个方面的 y 域限制适应每个方面内的数据子集;您可以通过明确指定域限制来使它们匹配。
放在一起,它看起来像这样:
alt.Chart(df).mark_bar().encode(
x=alt.X('c2:N', title=None),
y=alt.Y('sum(values):Q', axis=alt.Axis(grid=False, title=None), scale=alt.Scale(domain=[0, 25])),
column=alt.Column('c1:N', title=None),
color=alt.Color('DF:N', scale=alt.Scale(range=['#96ceb4', '#ffcc5c','#ff6f69']))
).configure_view(
strokeOpacity=0
).resolve_scale(
y='independent'
)
我想在 Python.
中使用 Altair 在分组和堆叠的条形图中为每个组使用单独的比例尺所以例如而不是下面的
我想要类似于以下内容的内容。在这张(Gimp)编辑过的图片中,我对所有 4 组 A、B、C 和 D 都使用了相同的比例。但是在我的实际数据中,不同组的数量级不同。所以每个Group应该有不同的scale。关于如何做到这一点有什么想法吗?
这是来自 HERE
的最小示例import pandas as pd
import numpy as np
import altair as alt
df1=pd.DataFrame(10*np.random.rand(4,3),index=["A","B","C","D"],columns=["I","J","K"])
df2=pd.DataFrame(10*np.random.rand(4,3),index=["A","B","C","D"],columns=["I","J","K"])
df3=pd.DataFrame(10*np.random.rand(4,3),index=["A","B","C","D"],columns=["I","J","K"])
def prep_df(df, name):
df = df.stack().reset_index()
df.columns = ['c1', 'c2', 'values']
df['DF'] = name
return df
df1 = prep_df(df1, 'DF1')
df2 = prep_df(df2, 'DF2')
df3 = prep_df(df3, 'DF3')
df = pd.concat([df1, df2, df3])
chart = alt.Chart(df).mark_bar().encode(
x=alt.X('c2:N', title=None),
y=alt.Y('sum(values):Q', axis=alt.Axis(grid=False, title=None)),
column=alt.Column('c1:N', title=None),
color=alt.Color('DF:N', scale=alt.Scale(range=['#96ceb4', '#ffcc5c','#ff6f69']))
).configure_view(
strokeOpacity=0
)
chart.save("Power.svg")
您可以通过添加
为图表设置独立的坐标轴resolve_scale(y='independent')
请注意,这本身可以让每个方面的 y 域限制适应每个方面内的数据子集;您可以通过明确指定域限制来使它们匹配。
放在一起,它看起来像这样:
alt.Chart(df).mark_bar().encode(
x=alt.X('c2:N', title=None),
y=alt.Y('sum(values):Q', axis=alt.Axis(grid=False, title=None), scale=alt.Scale(domain=[0, 25])),
column=alt.Column('c1:N', title=None),
color=alt.Color('DF:N', scale=alt.Scale(range=['#96ceb4', '#ffcc5c','#ff6f69']))
).configure_view(
strokeOpacity=0
).resolve_scale(
y='independent'
)