Vega条形图中的多个组带有单个条

如何解决Vega条形图中的多个组带有单个条

我正在尝试制作多轴/多分组的vega图表。

这是我要实现的目标:

multiple groups bar chart

我希望能够首先按年份对数据进行排序:2018、2019等。然后我希望将其分为“ 0、1、2、3”类别,然后再查看每种尺寸的数据“ s,m,l”等 基本上,我想拥有的是:我在2019年的“第三批”中有多少件T恤衫。

我希望我说得很清楚。

我不希望堆叠条形,而要单个条形。 另外,我希望顶轴根据年份具有不同的颜色。

我将不胜感激。

这是我到目前为止所拥有的:

{
  $schema: https://vega.github.io/schema/vega/v4.json
  padding: {left: 5,top: 25,right: 5,bottom: 50}
  data: [
    {
      name: source_0
      values: [
        {speedName: "A",connectionType: "s",speedCount: 0.1,speedValue: "2018"}
        {speedName: "A",connectionType: "m",speedCount: 0.3,connectionType: "l",speedCount: 0.5,speedCount: 0.6,speedValue: "2019"}
        {speedName: "A",speedCount: 0.9,speedValue: "2020"}
        {speedName: "B",speedCount: 0.7,speedValue: "2019"}
        {speedName: "B",speedCount: 0.2,speedCount: 1.1,speedValue: "2018"}
        {speedName: "C",speedValue: "2020"}
        {speedName: "C",speedValue: "2021"}
      ]
      transform: [
        {
          type: collect
          sort: {
            field: ["connectionType","speedName","speedValue"]
            order: ["ascending","ascending","ascending"]
          }
        }
        {
          type: collect
          sort: {
            field: ["connectionType","speedValue","speedNameSort"]
            order: ["ascending","ascending"]
          }
        }
        {type: "filter",expr: "datum.speedCount < 100"}
        {
          type: aggregate
          groupby: ["speedValue","connectionType"]
          ops: ["sum","count"]
          fields: ["speedCount","speedValue"]
          as: ["speedCount","count"]
        }
      ]
    }
    {
      name: data_0
      source: source_0
      transform: [
        {
          type: aggregate
          groupby: ["speedName","connectionType","speedValue"]
          ops: ["sum"]
          fields: ["speedCount"]
          as: ["speedCount"]
        }
        {
          type: filter
          expr: (datum["speedCount"]) && isFinite(+datum["speedCount"])
        }
      ]
    }
    {
      name: column_domain
      source: data_0
      transform: [
        {
          type: aggregate
          groupby: ["speedValue"]
        }
      ]
    }
  ]
  signals: [
    {name: "x_step",value: 30}
    {
      name: child_width
      update: bandspace(domain('x').length,0.1,0.05) * x_step
    }
    {name: "child_height",value: 200}
  ]
  layout: {
    padding: 25
    columns: {signal: "length(data('column_domain'))"}
    bounds: full
    align: all
  }
  marks: [
    {
      name: row_header
      type: group
      role: row-header
      encode: {
        update: {
          height: {signal: "child_height"}
        }
      }
      axes: [
        {
          orient: left
          scale: y
          domain: false
          grid: false
          labelOverlap: true
          ticks: false
          domain: false
          labelPadding: 10
          tickCount: {signal: "ceil(child_height/40)"}
          offset: 2
          tickCount: {signal: "ceil(child_height/40)"}
          zindex: 0
          labelColor: "#6c6c6c"
        }
      ]
    }
    {
      name: column_header
      type: group
      role: column-header
      from: {data: "column_domain"}
      sort: {field: "datum[\"speedValue\"]",order: "ascending"}
      encode: {
        update: {
          width: {signal: "child_width"}
        }
      }
      marks: [
        {
          name: rule
          from: {data: "column_domain"}
          type: rect
          encode: {
            enter: {
              stroke: {scale: "colors",field: "speedValue"}
            }
            update: {
              x: {signal: 0}
              y: {signal: "-25"}
              x2: {signal: "child_width"}
              fill: {scale: "colors",field: "speedValue"}
              strokeWidth: {signal: "2"}
            }
          }
        }
        {
          type: text
          from: {data: "column_domain"}
          encode: {
            update: {
              x: {signal: "child_width/2",field: "speedValue"}
              y: {signal: "-35"}
              x2: {signal: "child_width"}
              fill: {scale: "colors",field: "speedValue"}
              fontSize: {signal: "child_width/10 + 5"}
              align: {value: "center"}
              text: {
                signal: (parent["speedValue"]) ? parent["speedValue"] : ""+parent["speedValue"]
              }
            }
          }
        }
      ]
    }
    {
      name: column_footer
      type: group
      role: column-footer
      from: {
        facet: {
          name: facet
          data: data_0
          groupby: ["speedValue"]
        }
      }
      sort: {field: "datum[\"speedValue\"]",order: "ascending"}
      encode: {
        update: {
          width: {signal: "child_width"}
        }
        enter: {
          x: {scale: "x",field: "speedName"}
        }
      }
      axes: [
        {
          orient: bottom
          scale: x
          labelPadding: 25
          labelAngle: 0
          labelAlign: right
          labelBaseline: middle
          labelOverlap: true
          ticks: false
          speedValue: x
          labelColor: "#6c6c6c"
          grid: false
          domainColor: "#6c6c6c"
          domainWidth: 2.5
          zindex: 0
        }
      ]
      marks: [
        {
          type: group
          from: {
            facet: {data: "facet",name: "facet",groupby: "speedName"}
          }
          encode: {
            enter: {
              x: {scale: "x",field: "speedName"}
            }
          }
          scales: [
            {
              name: pos
              type: band
              range: width
              domain: {data: "facet",field: "connectionType"}
            }
          ]
          axes: [
            {
              orient: bottom
              scale: pos
              labelAngle: 0
              labelAlign: middle
              labelBaseline: middle
              labelOverlap: true
              ticks: false
              labelColor: "#6c6c6c"
              grid: false
              domainColor: "#6c6c6c"
              domainWidth: 2.5
              zindex: 0
              offset: 10
            }
          ]
        }
      ]
    }
    {
      name: cell
      type: group
      style: cell
      from: {
        facet: {
          name: facet
          data: data_0
          groupby: ["speedValue"]
        }
      }
      sort: {
        field: ["datum[\"speedValue\"]"]
        order: ["ascending"]
      }
      encode: {
        update: {
          width: {signal: "child_width"}
          height: {signal: "child_height"}
        }
      }
      marks: [
        {
          type: group
          from: {
            facet: {data: "facet",field: "connectionType"}
            }
          ]
          axes: [
            {
              orient: bottom
              scale: pos
              tickSize: 3
              labelPadding: 2
              offset: 5
              ticks: false
              labels: false
            }
          ]
          marks: [
            {
              name: child_marks
              type: rect
              style: ["bar"]
              from: {data: "facet"}
              encode: {
                update: {
                  fill: {scale: "color",field: "connectionType"}
                  ariaRoleDescription: {value: "bar"}
                  tooltip: {
                    signal: '''{"Speed Type": ''+datum["speedName"],"Speed": ''+datum["speedValue"],"Speed Count": datum['speedCount'],"Connection Type": ''+datum["connectionType"]}'''
                  }
                  x: {scale: "x",field: "connectionType"}
                  width: {scale: "x",band: 1}
                  y: {scale: "y",field: "speedCount"}
                  y2: {scale: "y",value: "0"}
                }
              }
            }
          ]
        }
      ]
    }
  ]
  scales: [
    {
      name: x
      type: band
      domain: {data: "data_0",field: "speedName"}
      range: {
        step: {signal: "x_step"}
      }
      paddingInner: 0.1
      paddingOuter: 0.05
    }
    {
      name: y
      type: linear
      domain: {data: "data_0",field: "speedCount"}
      range: [
        {signal: "child_height"}
        0
      ]
      nice: true
      zero: true
    }
    {
      name: color
      type: ordinal
      domain: {data: "source_0",field: "connectionType",sort: true}
      range: [
        "#e20074"
        "#000000"
        "#6c6c6c"
        "#b3b3b3"
        "#1063ad"
        "#1bada2"
        "#ea75b6"
      ]
    }
    {
      name: colors
      type: ordinal
      domain: [2018,2019,2020,2021,2022]
      range: ["#ff9a1e","#bfcb44","#1bada2","#53baf2","#1063ad"]
    }
  ]
  legends: [
    {
      fill: color
      direction: vertical
      padding: 10
      encode: {
        symbols: {
          update: {
            shape: {value: "square"}
          }
        }
      }
    }
  ]
}

这是到目前为止的样子:

result so far

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

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-