将文本标签的顺序与排序的堆叠条形段对齐

Align order of text labels with sorted stacked bar segments

我正在尝试向该图表添加文本。

我使用了这个代码,文本的顺序是正确的但是它的颜色是可变的根据各自的颜色bar 所以当我 bar+text 时,文字是不可见的

人们告诉我这是因为 “编码中指定的颜色优先于标记属性中指定的颜色” 所以我应该制作一个没有颜色的基本图表并基于它构建文本基本图表如下:

现在文本为黑色但显示顺序错误。我认为问题在于我只能根据需要按颜色订购酒吧(首先是有偿工作,然后是教育、睡眠……)。因此,如果我希望我的文本变黑而不在基本图表中为我的条形着色,我就会失去我想要的顺序。

有什么方法可以使文本变黑,同时保持顺序正确? (首先是有偿工作,然后是教育、睡眠等等)。

color=alt.value('black') 放在编码中而不是标记中,或者不要从基本图表继承文本标记。

如您所说,“编码中指定的颜色优先于标记属性中指定的颜色”。这在此处的文档中有详细说明:Global Config vs. Local Config vs. Encoding.

您从基本图表中删除颜色的解决方案是正确的:问题是您还删除了(自然地)形成颜色的顺序,因此文本不再具有相同的顺序。从基本图表中删除颜色但保留顺序,它应该可以工作。

或者,您可以使用

覆盖文本图表中的编码
chart.encode(
  color=alt.value('black')
)

您将需要使用颜色编码来指定排序顺序,因为这将覆盖 mark_text 中设置的任何颜色,您还需要将文本颜色编码的范围设置为仅包括黑色.解决色标确保只有文本是黑色的。我认为没有办法在每个条形段内将文本水平居中。

import altair as alt
from vega_datasets import data

source = data.barley()

site_order = ['Duluth', 'Crookston', 'Waseca', 'University Farm', 'Grand Rapids', 'Morris']
bars = 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'))

text = bars.mark_text(align='right', dx=-2).encode(
    x=alt.X('sum(yield):Q', stack=True),
    color=alt.Color('site', sort=site_order, scale=alt.Scale(range=['black']), legend=None),
    text=alt.Text('sum(yield):Q', format='.1f'))

(bars + text).resolve_scale(color='independent')