繁体   English   中英

如何在Altair散点图中的最大点添加单个文本标签?

[英]How do you add a single text label to the max point in an Altair scatter plot?

我正在尝试在Altair中创建一个散点图,我想在最大y的点上添加文本标签或注释。

我已经能够将text_marks添加到所有点,但我无法弄清楚如何基于max(y)标记特定点

这是一些示例数据:

df = pd.DataFrame(columns=['date', 'daily', 'total'], 
         data=[['2019-08-01', 29, 102370],
               ['2019-08-02', 18, 102388],
               ['2019-08-03', 19, 102407],
               ['2019-08-04', 13, 102420],
               ['2019-08-05', 29, 102449],
               ['2019-08-06', 49, 102498],
               ['2019-08-07', 31, 102529],
               ['2019-08-08', 39, 102568],
               ['2019-08-09', 23, 102591],
               ['2019-08-10', 17, 102608],
               ['2019-08-11', 18, 102626],
               ['2019-08-12', 38, 102664],
               ['2019-08-13', 22, 102686]])

这是我到目前为止所提出的,但它没有做我想要的,我想我可能过度复杂了

chart = alt.Chart(
  data=df,
).mark_line(
    color='red'
).encode(
    alt.X('date:T', title=''),
    alt.Y('daily:Q', title='')
)

text = alt.Chart(df).mark_text().encode(
    x=alt.X('max(date):T'),
    y=alt.Y('max(daily):Q'),
    text=alt.Text('max(daily):Q')
)


(chart + text)

在Vega-Lite语法中执行此操作的简明方法是使用argmax聚合。 例如:

chart = alt.Chart(
  data=df,
).mark_line(
    color='red'
).encode(
    alt.X('date:T', title=''),
    alt.Y('daily:Q', title='')
)

text = alt.Chart(df).mark_text(dy=-15, color="red").encode(
    x=alt.X('date:T', aggregate={'argmax': 'daily'}),
    y=alt.Y('max(daily):Q'),
    text=alt.Text('max(daily):Q')
)

chart + text

在此输入图像描述

有两种方法可以做你想要的:

  1. 使用pandas过滤数据(对我而言,这是最简单但不总是简单或可用的,
  2. 一维加-精简版的版本,带过滤器:一个transform_window排名数据和transform_filter只保留最大值

熊猫版:

chart = (
    alt.Chart(data=df)
    .mark_line(color="red")
    .encode(alt.X("date:T", title=""), alt.Y("daily:Q", title=""))
)

text = (
    alt.Chart(df.query("daily == daily.max()"))
    .mark_text(dy=-15, color="red")
    .encode(x=alt.X("date:T"), y=alt.Y("daily:Q"), text=alt.Text("daily:Q"))
)


(chart + text)

Vega-lite版本:

chart = (
    alt.Chart(data=df)
    .mark_line(color="red")
    .encode(alt.X("date:T", title=""), alt.Y("daily:Q", title=""))
)

text = (
    alt.Chart(df)
    .mark_text(dy=-15, color="red")
    .transform_window(
        sort=[alt.SortField("daily", order="descending")], 
        rank="rank(daily)"
    )
    .transform_filter(alt.datum.rank == 1)
    .encode(x=alt.X("date:T"), 
            y=alt.Y("daily:Q"), 
            text=alt.Text("daily:Q"))
)


(chart + text)

两个代码都生成下面的图表:

只有最大值作为文本的图表

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM