使用 Altair 对标准化堆叠条形图进行排序
sort a normalized stacked bar chart with Altair
我正在尝试根据特定顺序对标准化堆叠条形图进行排序。
我想要按此顺序排序的堆叠条形图:
Order = dict({'Paid work':1,'Education':2,'Sleep':3,'Other unpaid work':4,'Housework & Shopping':5,'Personal care':6, 'Eating and drinking':7,'TV and Radio':8,'Seeing friends':9,'Other leisures':10})
国家(Y 轴)也应按“付费工作”栏的长度排序。
但我得到的是图表左端带有“电视和广播”的订单,看不到哪个国家/地区的人花在“有偿工作”上的时间最多。
我的尝试:
错误代码:
alt.Chart(df).mark_bar(size=15).encode(
alt.Y('Country:O'),
alt.X('Time:Q', stack='normalize',sort=alt.EncodingSortField(field='Order',order='descending')),
alt.Color('Category:N',sort=alt.EncodingSortField(field='Order')),
tooltip=['Country', 'Category', 'Time']
).properties(
width=600,
height=600, title = {'text' :'How do people spend their time?',
'subtitle' : 'Average of minutes per day from time-use diaries for people between 15 and 64'})
我是这个平台的新手,请看一下这个笔记本中的数据和我的简单代码:https://www.kaggle.com/hoangyennhi/exercise-dv
如果您将 alt.Color()
中的 sort
参数设置为 'ascending'
或 'descending'
,它会自动对堆积条进行排序:
import altair as alt
from vega_datasets import data
source = data.barley()
alt.Chart(source).mark_bar().encode(
x='sum(yield)',
y='variety',
color=alt.Color('site', sort='descending'))
然而,当您指定自定义排序顺序时,它不会像现在这样 not yet supported by Vega-Lite. A workaround was described in this comment,其中提到您可以使用一个名为 color_<name-of-column>_sort_index
的特殊字段来根据颜色索引进行排序。在此示例中,它看起来像这样:
site_order = ['Duluth', 'Crookston', 'Waseca', 'University Farm', 'Grand Rapids', 'Morris']
alt.Chart(source).mark_bar().encode(
x='sum(yield)',
y='variety',
color=alt.Color('site', sort=site_order),
order=alt.Order('color_site_sort_index:Q'))
我按照您的指导成功订购了该类别,这是结果:
但是我可以再问你一个问题吗?我现在遇到文本颜色问题,当我添加文本时,它与条形颜色相同,所以它是不可见的。我想把它变成黑色但是不可能。
我搜索了一些 github(来源:https://github.com/altair-viz/altair/issues/1033),他们告诉我创建一个不对条形着色的基本图表,并使用该基本图表创建文本。但是我不能在没有不同颜色的情况下制作我的基础,同时仍然保持类别的顺序(类别的顺序是根据我在 CatOrder 中定义的颜色)
我的问题是:如何在保持每个栏行中类别顺序的同时使文本变黑?
如果我的问题让您感到困惑,请查看我的代码:https://www.kaggle.com/hoangyennhi/exercise-dv
非常感谢您的帮助。
我正在尝试根据特定顺序对标准化堆叠条形图进行排序。
我想要按此顺序排序的堆叠条形图:
Order = dict({'Paid work':1,'Education':2,'Sleep':3,'Other unpaid work':4,'Housework & Shopping':5,'Personal care':6, 'Eating and drinking':7,'TV and Radio':8,'Seeing friends':9,'Other leisures':10})
国家(Y 轴)也应按“付费工作”栏的长度排序。
但我得到的是图表左端带有“电视和广播”的订单,看不到哪个国家/地区的人花在“有偿工作”上的时间最多。
我的尝试:
错误代码:
alt.Chart(df).mark_bar(size=15).encode(
alt.Y('Country:O'),
alt.X('Time:Q', stack='normalize',sort=alt.EncodingSortField(field='Order',order='descending')),
alt.Color('Category:N',sort=alt.EncodingSortField(field='Order')),
tooltip=['Country', 'Category', 'Time']
).properties(
width=600,
height=600, title = {'text' :'How do people spend their time?',
'subtitle' : 'Average of minutes per day from time-use diaries for people between 15 and 64'})
我是这个平台的新手,请看一下这个笔记本中的数据和我的简单代码:https://www.kaggle.com/hoangyennhi/exercise-dv
如果您将 alt.Color()
中的 sort
参数设置为 'ascending'
或 'descending'
,它会自动对堆积条进行排序:
import altair as alt
from vega_datasets import data
source = data.barley()
alt.Chart(source).mark_bar().encode(
x='sum(yield)',
y='variety',
color=alt.Color('site', sort='descending'))
然而,当您指定自定义排序顺序时,它不会像现在这样 not yet supported by Vega-Lite. A workaround was described in this comment,其中提到您可以使用一个名为 color_<name-of-column>_sort_index
的特殊字段来根据颜色索引进行排序。在此示例中,它看起来像这样:
site_order = ['Duluth', 'Crookston', 'Waseca', 'University Farm', 'Grand Rapids', 'Morris']
alt.Chart(source).mark_bar().encode(
x='sum(yield)',
y='variety',
color=alt.Color('site', sort=site_order),
order=alt.Order('color_site_sort_index:Q'))
我按照您的指导成功订购了该类别,这是结果:
但是我可以再问你一个问题吗?我现在遇到文本颜色问题,当我添加文本时,它与条形颜色相同,所以它是不可见的。我想把它变成黑色但是不可能。
我搜索了一些 github(来源:https://github.com/altair-viz/altair/issues/1033),他们告诉我创建一个不对条形着色的基本图表,并使用该基本图表创建文本。但是我不能在没有不同颜色的情况下制作我的基础,同时仍然保持类别的顺序(类别的顺序是根据我在 CatOrder 中定义的颜色)
我的问题是:如何在保持每个栏行中类别顺序的同时使文本变黑?
如果我的问题让您感到困惑,请查看我的代码:https://www.kaggle.com/hoangyennhi/exercise-dv
非常感谢您的帮助。