首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在vega (不是vega)中的刷/链接

在vega (不是vega)中的刷/链接
EN

Stack Overflow用户
提问于 2020-01-03 23:28:47
回答 1查看 197关注 0票数 3

我试图在vega中刷/链接两个点,更具体地说,是一个节点链接图和几个散点图。基于在节点链接图中拖拽信号的方式,我确实走得很远,但还不够远.

为了简单起见,我将在这里提供一些测试代码,只使用两个零散图:

代码语言:javascript
复制
{
  "$schema": "https://vega.github.io/schema/vega/v5.json",
  "padding": 0,
  "autosize": "none",
  "width": 800,
  "height": 400,

  "signals": [
    { "description": "Any datapoint is activated",
      "name": "datapoint_is_activated", "value": false,
      "on": [
        {
          "events": "symbol:mouseover",
          "update": "true"
        },
        {
          "events": "symbol:mouseout",
          "update": "false"
        }
      ]
    },
    { "description": "Active datapoint",
      "name": "activated_datapoint", "value": null,
      "on": [
        {
          "events": "symbol:mouseover",
          "update": "item()"
        },
        {
          "events": "symbol:mouseout",
          "update": "null"
        }
      ]
    }
  ],

  "data": [
    {
      "name": "table",
      "values": [
        {"name": "point A", "a": 1, "b": 2, "c": 3},
        {"name": "point B", "a": 4, "b": 5, "c": 6},
        {"name": "point C", "a": 9, "b": 8, "c": 7}
      ]
    }
  ],

  "scales": [
    { "name": "xscale",
      "type": "linear",
      "domain": [0,10],
      "range": [0,200]
    },
    { "name": "yscale",
      "type": "linear",
      "domain": [0,10],
      "range": [0,200]
    }
  ],

  "layout": {"padding": 20},

  "marks": [
    { "name": "plot1",
      "type": "group",
      "axes": [
        {"orient": "bottom", "scale": "xscale"},
        {"orient": "right", "scale": "yscale"}
      ],
      "marks": [
        {
          "type": "symbol",

          "from": {"data": "table"},

          "encode": {
            "enter": {
              "x": {"field": "a", "scale": "xscale"},
              "y": {"field": "b", "scale": "yscale"},
              "tooltip": {"field": "name"}
            },
            "update": {
              "size": {"value": 100},
              "fill": {"value": "grey"}
            }
          }
        }
      ]
    },
    { "name": "plot2",
      "type": "group",
      "axes": [
        {"orient": "bottom", "scale": "xscale"},
        {"orient": "right", "scale": "yscale"}
      ],
      "marks": [
        {
          "type": "symbol",

          "from": {"data": "table"},

          "on": [
            {
              "trigger": "datapoint_is_activated",
              "modify": "activated_datapoint",
              "values": "{fill: \"red\"}"
            },
            {
              "trigger": "!datapoint_is_activated",
              "modify": "activated_datapoint",
              "values": "{fill: \"grey\"}"
            }
          ],

          "encode": {
            "enter": {
              "x": {"field": "a", "scale": "xscale"},
              "y": {"field": "c", "scale": "yscale"},
              "size": {"value": 100},
              "tooltip": {"field": "name"}
            },
            "update": {
              "fill": {"value": "grey"}
            }
          }
        }
      ]
    }
  ]
}

生成的图像如下所示:

其思想是,在左侧图中的数据点上悬停将突出显示右侧图中相应的数据点。我知道这在vega中很简单,但还不支持节点链接图。因此:维加。

我在代码中的方法是:

  • 在外部范围内创建一个信号,跟踪(a)如果有激活的点,以及(b)这是图2中的
  • ,它具有一个触发器,该触发器接收已激活的数据点并将其颜色更改为“红色”。

我有一种隐晦的感觉,这与我对modifyvalues部分的定义有关,但我无法理解。

任何帮助都非常感谢!

谢谢你简。

EN

回答 1

Stack Overflow用户

发布于 2020-01-06 14:20:32

经过多次尝试和错误之后,我确实找到了一个方法来做到这一点。我没有使用trigger (我认为这将是这方面的规范方法),我只是在fill部分:datapoint_is_activated && datum === activated_datapoint.datum中使用了一个test。请参阅下面的代码和图像。

代码语言:javascript
复制
{
  "$schema": "https://vega.github.io/schema/vega/v5.json",
  "padding": 0,
  "autosize": "none",
  "width": 800,
  "height": 400,

  "signals": [
    { "description": "Any datapoint is activated",
      "name": "datapoint_is_activated", "value": false,
      "on": [
        {
          "events": "symbol:mouseover",
          "update": "true"
        },
        {
          "events": "symbol:mouseout",
          "update": "false"
        }
      ]
    },
    { "description": "Active datapoint",
      "name": "activated_datapoint", "value": null,
      "on": [
        {
          "events": "symbol:mouseover",
          "update": "item()"
        },
        {
          "events": "symbol:mouseout",
          "update": "null"
        }
      ]
    }
  ],

  "data": [
    {
      "name": "table",
      "values": [
        {"name": "point A", "a": 2, "b": 2, "c": 4},
        {"name": "point B", "a": 4, "b": 5, "c": 6},
        {"name": "point C", "a": 5, "b": 3, "c": 5}
      ]
    }
  ],

  "scales": [
    { "name": "xscale",
      "type": "linear",
      "domain": [0,10],
      "range": [0,200]
    },
    { "name": "yscale",
      "type": "linear",
      "domain": [0,10],
      "range": [0,200]
    }
  ],

  "layout": {"padding": 20},

  "marks": [
    { "name": "plot1",
      "type": "group",
      "axes": [
        {"orient": "bottom", "scale": "xscale"},
        {"orient": "right", "scale": "yscale"}
      ],
      "marks": [
        {
          "type": "symbol",

          "from": {"data": "table"},

          "encode": {
            "enter": {
              "x": {"field": "a", "scale": "xscale"},
              "y": {"field": "b", "scale": "yscale"},
              "tooltip": {"field": "name"},
              "size": {"value": 200}
            },
              "update": {
              "fill": [
                {"test": "datapoint_is_activated && datum === activated_datapoint.datum",
                "value": "red"},
                {"value": "lightgrey"}
              ]

            }
          }
        }
      ]
    },
    { "name": "plot2",
      "type": "group",
      "axes": [
        {"orient": "bottom", "scale": "xscale"},
        {"orient": "right", "scale": "yscale"}
      ],
      "marks": [
        {
          "type": "symbol",

          "from": {"data": "table"},

          "encode": {
            "enter": {
              "x": {"field": "a", "scale": "xscale"},
              "y": {"field": "c", "scale": "yscale"},
              "size": {"value": 200},
              "tooltip": {"field": "name"}
            },
            "update": {
              "fill": [
                {"test": "datapoint_is_activated && datum === activated_datapoint.datum",
                "value": "red"},
                {"value": "lightgrey"}
              ]

            }
          }
        }
      ]
    }
  ]
}

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59586545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档