You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Highcharts Heatmap y轴标签渲染异常问题求助

问题

HeatMap的y轴分类标签未显示在左侧外部,而是偏移至最后一个单元格内部。代码预览时显示正常,但实际渲染后出现异常(如图所示)。

相关代码

package.json

{"name": "my-dashboard","version": "0.1.0","private": true,"scripts": {"serve": "vue-cli-service serve","build": "vue-cli-service build","lint": "vue-cli-service lint"},"dependencies": {"@fortawesome/fontawesome-svg-core": "^6.5.2","@fortawesome/free-brands-svg-icons": "^6.5.2","@fortawesome/free-solid-svg-icons": "^6.5.2","@fortawesome/vue-fontawesome": "^3.0.6","@highcharts/map-collection": "^2.1.0","@popperjs/core": "^2.11.8","ag-grid-vue3": "^31.3.1","axios": "^1.6.8","bootstrap": "^5.3.3","core-js": "^3.8.3","country-list": "^2.3.0","crypto-browserify": "^3.12.0","dotenv": "^16.4.5","highcharts": "^11.4.6","highcharts-vue": "^2.0.1","os-browserify": "^0.3.0","path": "^0.12.7","path-browserify": "^1.0.1","require": "^2.4.20","stream-browserify": "^3.0.0","vm-browserify": "^1.1.2","vue": "^3.4.33","vue-axios": "^3.5.2","vue-jalali-moment": "^1.0.0","vue-multiselect": "^3.0.0-beta.3","vue-router": "^4.3.2","vue3-daterange-picker": "^1.0.1"},"devDependencies": {"@babel/core": "^7.12.16","@babel/eslint-parser": "^7.12.16","@types/bootstrap": "^5.2.10","@vue/cli-plugin-babel": "~5.0.0","@vue/cli-plugin-eslint": "~5.0.0","@vue/cli-service": "~5.0.0","eslint": "^7.32.0","eslint-plugin-vue": "^8.0.3","sass": "^1.75.0","sass-loader": "^14.2.1","style-loader": "^4.0.0"},"eslintConfig": {"root": true,"env": {"browser": true,"es2021": true},"extends": ["plugin:vue/vue3-essential","eslint:recommended"],"parserOptions": {"parser": "@babel/eslint-parser","ecmaVersion": 2021,"requireConfigFile": false},"rules": {}},"browserslist": ["> 1%","last 2 versions","not dead","not ie 11"]}

main.js

import { createApp } from "vue";import App from "./App.vue";import router from "./router";import Highcharts from "highcharts";import Stock from "highcharts/modules/stock";import Drilldown from "highcharts/modules/drilldown";import HighchartsAccessibility from "highcharts/modules/accessibility";import HighchartsExporting from "highcharts/modules/exporting";import HighchartsExportData from "highcharts/modules/export-data";import MapModule from "highcharts/modules/map";import HighchartsHeatMap from "highcharts/modules/heatmap";import HighchartsMore from "highcharts/highcharts-more";import HighchartsVue from "highcharts-vue";import mapDataWorld from "@highcharts/map-collection/custom/world.geo.json";import "bootstrap/dist/css/bootstrap.min.css";import axios from "axios";import VueAxios from "vue-axios";import moment from "moment";import DateRangePicker from "vue3-daterange-picker";import { getCode } from "country-list";import { library } from "@fortawesome/fontawesome-svg-core";import {faGlobe,faFlag,faPodcast,faCalendar,faFileCsv,} from "@fortawesome/free-solid-svg-icons";import { FontAwesomeIcon } from "@fortawesome/vue-fontawesome";import {faFacebook,faSquareXTwitter,faYoutube,faInstagram,faTelegram,} from "@fortawesome/free-brands-svg-icons";library.add(faGlobe,faFlag,faFacebook,faSquareXTwitter,faYoutube,faInstagram,faTelegram,faPodcast,faCalendar,faFileCsv);const app = createApp(App);app.use(VueAxios, axios);app.config.globalProperties.axios = axios;app.config.globalProperties.$moment = moment;app.config.globalProperties.$getCode = getCode;Stock(Highcharts);Drilldown(Highcharts);HighchartsMore(Highcharts);HighchartsHeatMap(Highcharts);HighchartsExporting(Highcharts);HighchartsExportData(Highcharts);HighchartsAccessibility(Highcharts);MapModule(Highcharts);Highcharts.maps["myMapName"] = mapDataWorld;app.use(HighchartsVue);app.component("DateRangePicker", DateRangePicker);app.component("font-awesome-icon", FontAwesomeIcon);app.use(router);app.mount("#app");

components/MainHeatMap.vue

<template>
  <div>
    <highcharts
      :constructor-type="'stockChart'"
      class="hc"
      :options="chartOptions"
      ref="chart"
    ></highcharts>
  </div>
</template>

<script>
export default {
  data() {
    return {
      chartOptions: {
        chart: {
          backgroundColor: "#fbfcf8",
          type: "heatmap",
          plotBorderWidth: 1,
          height: "100%",
          margin: [0, 0, 0, 0],
        },
        title: { text: "Views", align: "center" },
        exporting: {
          enabled: true,
        },
        credits: { enabled: false },
        legend: { enabled: true, itemStyle: { color: "#000" } },
        rangeSelector: { enabled: false },
        navigator: { enabled: false },
        scrollbar: { enabled: false },
        xAxis: {
          categories: [
            "America",
            "South & Central Asia",
            "News Network",
            "Eurasia",
            "East Asia",
            "Africa",
            "English",
          ],
        },
        yAxis: {
          categories: [
            "Jun 16, 2024",
            "Jun 23, 2024",
            "Jun 30, 2024",
            "Jul 7, 2024",
            "Jul 14, 2024",
          ],
          reversed: false,
        },
        accessibility: {
          point: {
            descriptionFormat:
              "{(add index 1)}. {series.xAxis.categories.(x)} {series.yAxis.categories.(y)}, {value}.",
          },
        },
        colorAxis: { min: 0, minColor: "#FFFFFF", maxColor: "#DA70D6" },
        tooltip: { style: { color: "#000" } },
        series: [
          {
            name: "Video Views",
            borderWidth: 1,
            data: [
              [0, 0, 75059],
              [0, 1, 493747],
              [0, 2, 449083],
              [0, 3, 490321],
              [0, 4, 429733],
              [1, 0, 103570],
              [1, 1, 340369],
              [1, 2, 383821],
              [1, 3, 452833],
              [1, 4, 511894],
              [2, 0, 1361371],
              [2, 1, 4394413],
              [2, 2, 4518221],
              [2, 3, 4581342],
              [2, 4, 4623790],
              [3, 0, 231918],
              [3, 1, 976761],
              [3, 2, 791173],
              [3, 3, 1010918],
              [3, 4, 1065976],
              [4, 0, 2186104],
              [4, 1, 7183474],
              [4, 2, 7521511],
              [4, 3, 7750003],
              [4, 4, 7846560],
              [5, 0, 225868],
              [5, 1, 857518],
              [5, 2, 897654],
              [5, 3, 908779],
              [5, 4, 933288],
              [6, 0, 284781],
              [6, 1, 2015884],
              [6, 2, 1168136],
              [6, 3, 1088461],
              [6, 4, 1403736],
            ],
            dataLabels: { enabled: true, color: "#000000" },
          },
        ],
        responsive: {
          rules: [
            {
              condition: { maxWidth: 500 },
              chartOptions: {
                yAxis: { labels: { format: "{substr value 0 1}" } },
              },
            },
          ],
        },
      },
      fullData: [],
    };
  },
  watch: {
    chartData: {
      handler(newChartData, oldChartData) {
        if (newChartData !== oldChartData) {
          this.updateChartData(newChartData);
        }
      },
      deep: true,
    },
  },
};
</script>

components/Web/HeatMap.vue

<template>
  <SharedHeatMap :chartData="chartData" />
</template>

<script>
import SharedHeatMap from "@/components/MainHeatMap.vue";

export default {
  components: {
    SharedHeatMap,
  },
  props: {
    chartData: {
      type: Array,
      default: () => [],
    },
  },
};
</script>

<style scoped>
/* Add your component-specific styles here */
</style>

components/MainTab.vue

<template>
  <div id="webs" class="m-2 d-inline-flex">
    <div style="width: 100%" class="d-flex flex-column">
      <HeatMap id="heatMap" style="width: 100%" />
    </div>
  </div>
</template>

<script>
import "bootstrap/dist/css/bootstrap.min.css";
import HeatMap from "./WebTab/HeatMap.vue";

export default {
  components: { HeatMap },
};
</script>

<style>
/* Add your component-specific styles here */
</style>

异常效果

HeatMap异常效果


原因分析

  1. 错误使用StockChart构造器:HeatMap属于Highcharts标准图表类型,却用了为股票时序数据设计的StockChart构造器,两者布局逻辑不兼容,导致坐标轴空间计算异常。
  2. 边距设置为0:chart.margin = [0,0,0,0]完全移除了图表左侧边距,y轴标签没有足够空间显示在外部,被挤压到绘图区域内。
  3. 容器高度未明确:图表设置height: "100%"但父容器无明确高度,渲染时高度计算偏差进一步加剧标签偏移问题。

解决方案

1. 替换构造器为标准Chart

修改MainHeatMap.vue中的构造器类型,使用Highcharts通用的Chart构造器:

<highcharts
  :constructor-type="'chart'"
  class="hc"
  :options="chartOptions"
  ref="chart"
></highcharts>

2. 调整图表边距,预留标签空间

修改chart.margin,给左侧留出足够空间容纳y轴标签:

chart: {
  backgroundColor: "#fbfcf8",
  type: "heatmap",
  plotBorderWidth: 1,
  height: "100%",
  margin: [10, 10, 10, 80], // 左侧边距设为80,可根据标签长度调整
},

3. 明确父容器高度

给MainTab.vue中的HeatMap容器添加固定高度,避免图表高度计算异常:

<div style="width: 100%; height: 500px;" class="d-flex flex-column">
  <HeatMap id="heatMap" style="width: 100%; height: 100%" />
</div>

4. 可选:优化y轴标签位置

如果标签仍有偏移,可通过y轴配置调整标签对齐和位置:

yAxis: {
  categories: ["Jun 16, 2024", "Jun 23, 2024", "Jun 30, 2024", "Jul 7, 2024", "Jul 14, 2024"],
  reversed: false,
  labels: {
    align: 'right',
    x: -10, // 向左偏移标签位置
    style: {
      whiteSpace: 'nowrap'
    }
  }
},

内容的提问来源于stack exchange,提问作者nb_nb_nb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 21:57:03