分层图表从一个图表中删除标记

如何解决分层图表从一个图表中删除标记

我有以下数据:

  • 在我想要绘制的时间间隔内的各种测量值(每个测量值都有一个名称)(每个测量值一行)
  • 一种度量称为“状态”,我想用它来为图表的背景(垂直切片)着色

测量数据框看起来像这样:

                     Time Trend  Value
0     2021-03-24 16:10:20     A   -1.3
1     2021-03-24 16:10:35     A   -5.3
2     2021-03-24 16:10:50     A   -6.3
3     2021-03-24 16:11:05     A   -2.3
4     2021-03-24 22:39:05     A   -5.3
...                   ...   ...    ...
12443 2021-03-24 16:10:20     H    0.0
12444 2021-03-24 22:38:20     H    1.0
12445 2021-03-24 22:38:35     H    2.0
12446 2021-03-24 22:38:50     H    3.0
12447 2021-03-24 22:39:05     H    4.0

为此,我提取了某个状态为“活动”的时间范围,如下所示:

      State               Start                 End
0      Idle 2021-03-24 16:10:20 2021-03-24 16:10:50
1      Pump 2021-03-24 16:10:50 2021-03-24 16:20:05
...
5      Cool 2021-03-24 20:42:20 2021-03-24 22:01:35
6      Pump 2021-03-24 22:01:35 2021-03-24 22:02:50

然后我创建了两个图表,我想将它们与 alt.layer 结合

  • 每个测量(趋势)都有线条
  • 每个州都有一个矩形
 alt_st = (
        alt.Chart(state_df)
        .mark_rect()
        .encode(
            x=alt.X("Start",title="Time"),x2=alt.X2("End",y=alt.value(15),y2=alt.value(0),color=alt.Color("State:O",scale=get_state_scale(state_df.State.unique())),)
        # .add_selection(selection)
    )

rectangle state chart

chart = (
    alt.Chart(df)
    .mark_line()
    .encode(
        alt.X("Time"),alt.Y("Value"),color="Trend",)
)

measurement chart

结合alt.layer

alt.layer(chart,alt_st).resolve_legend("independent")

Combined chart

可以看出,合并后的图表有一个混乱的图例,第一个图表中的标记(线)消失了。

到目前为止我尝试过的:

  • 查看 altair 和 Vega-Lite 的 GitHub 存储库中的问题
  • 更改顺序(没有帮助)
  • 改用 vConcat(没有帮助)
  • 从状态图中删除自定义比例(这有帮助,但结果也不太好)

在这里尝试创建一个最小示例时发现的最后一件事。

without scale

我发现了一个类似的问题 (Altair: Layered Line Chart with Legend and Custom Colors),但不知道如何将解决方案应用于我的案例。

到目前为止,我的印象是我所做的对于 altair/Vega-Lite 来说非常单调——如果有人能指出我遗漏的相关概念,我会很高兴。

解决方法

您最后的内容看起来是正确的,但您可能希望使用 resolve_scale(color='independent') 而不是 resolve_legend('independent') 来正确分隔图例:

import altair as alt
from vega_datasets import data

source = data.iowa_electricity()
# Create end year for mark_rect
source['end_year'] = source.groupby('source')['year'].shift(-1)
source = source.dropna()

line = alt.Chart(source).mark_line().encode(
    x="year:T",y="net_generation:Q",color="source:N")

bar = alt.Chart(source).mark_rect().encode(
    x="year:T",x2="end_year",color='year(year):O',y=alt.value(15),y2=alt.value(0)
)

(bar + line).resolve_scale(color='independent')

enter image description here

您可以使用 mark_rect(yOffset=270,y2Offset=300) 将条形移动到底部(偏移量以像素为单位而不是图表单位,与您对 y 和 y2 使用 alt.value 时相同):

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?