Highcharts v11 绘制表格

JS: 

const renderer = new Highcharts.Renderer(
	document.getElementById('container'),
	510,
	300
);
let width=490;//表格的宽度
let headerHeight=40//表头高度
let rowHeight=30 //行高度
let header=['英雄名称','输出值<br>\t(%)','每死承伤<br>\t(%)','推塔数<br>\t(个)','击杀数<br>\t(个)','趴窝数<br>\t(个)','最终评分'];//表头模型
let data=[['吕布','22.31','15.26','5','17','9','13.3'],
		  ['貂蝉','6.31','5.16','1','0','12','2.9'],
		  ['马可波罗','33.11','14.21','5','22','11','9.8'],
		  ['典韦','2.31','1.16','0','0','22','2.2'],
		  ['张良','16.66','25.16','10','5','0','11.8']];//行数据
let height=headerHeight+data.length*rowHeight;//获取表格的总高度
let columnWidth=width/header.length //列宽度
const M={x:10,y:7};//文本偏移量 根据实际情况调整 或者动态创建
const padding=0.5;//使边框更加清晰防止出现虚化现象(懂得都懂)
renderer.path(['M', 0+padding, 0+padding, 'H', width+padding,'V',height+padding,'H',0+padding,'Z']).attr({'stroke-width': 1,stroke: 'black'}).add();//绘制表格边框
renderer.path(['M',0+padding,headerHeight+padding,'H',width+padding]).attr({'stroke-width':1,stroke:'black'}).add();//表头横线
header.forEach((head,index)=>{
	let x=index*columnWidth;
	index>0?renderer.path(['M',x+padding,0+padding,'V',height]).attr({'stroke-width':1,stroke:'black'}).add():null;//表格垂直线绘制
	let content=`<div class="text">${head}</div>`;
	renderer.text(content,x+M.x,M.y,false).add()
});
data.forEach((item,index)=>{
	index>0?renderer.path(['M',0+padding,headerHeight+(index*rowHeight)+padding,'H',width+padding]).attr({'stroke-width':1,stroke:'black'}).add():null;//每条数据横线
	const y=headerHeight+index*rowHeight;//获取每行数据基础y值
	//循环表头
	header.forEach((head,headIndex)=>{
		const x=headIndex*columnWidth;
		renderer.text(item[headIndex],x+M.x,y+M.y+5,false).attr({
			'alignment-baseline': 'hanging',
			'text-anchor':'start'
		}).css({
			'font-size':'13px'
		}).add()
	})//每行数据按照列拆分并渲染每列数据
});

HTML 代码:

<script src="https://code.highcharts.com/11.4.1/highcharts.js"></script>
<div id="container" style="height:300px;"></div>
<style>
	.text{
		text-align: center;
		width: fit-content;
		border: 1px solid red;
		alignment-baseline: hanging;
		text-anchor:start;
		font-size:13px;
	}
</style>

 运行效果:

 Vue项目中实战优化版: (加入了transform坐标转换)

rendererTable(chart) {
      console.log(chart)
      let renderer = chart?.renderer
      if (!renderer) {
        return;
      }
      let width = chart?.plotWidth*0.9||490;//表格的宽度
      let headerHeight = 40//表头高度
      let rowHeight = 30 //行高度
      let header = ['英雄名称', '输出值<br>\t(%)', '每死承伤<br>\t(%)', '推塔数<br>\t(个)', '击杀数<br>\t(个)', '趴窝数<br>\t(个)', '最终评分'];//表头模型
      let data = [['吕布', '22.31', '15.26', '5', '17', '9', '13.3'],
        ['貂蝉', '6.31', '5.16', '1', '0', '12', '2.9']];//行数据(实际场景是动态获取的)
      let height = headerHeight + data.length * rowHeight;//获取表格的总高度
      let columnWidth = width / header.length //列宽度
      //定义原点坐标用于坐标转换
      const P = {
        x: chart.plotLeft+20,
        y: 20
      }
      const text_Attributes = {
        'alignment-baseline': 'hanging',
        'text-anchor': 'start',
        transform: `translate(${P.x},${P.y})`
      }

      const border_Attributes = {
        'stroke-width': 1,
        stroke: 'black',
        transform: `translate(${P.x},${P.y})`
      }
      const M = {x: 10, y: 7};//文本偏移量 根据实际情况调整 或者动态创建
      const padding = 0.5;//使边框更加清晰防止出现虚化现象(懂得都懂)
      renderer.path(['M', padding, padding, 'H', width + padding, 'V', height + padding, 'H', padding, 'Z']).attr({...border_Attributes}).add();//绘制表格边框
      renderer.path(['M', padding, headerHeight + padding, 'H', width + padding]).attr({...border_Attributes}).add();//表头横线
      header.forEach((head, index) => {
        let x = index * columnWidth;
        index > 0 ? renderer.path(['M', x + padding, padding, 'V', height]).attr({...border_Attributes}).add() : null;//表格垂直线绘制
        let content = `${head}`;
        renderer.text(content, x + M.x, M.y, false).attr({...text_Attributes}).add()
      });
      data.forEach((item, index) => {
        index > 0 ? renderer.path(['M', padding, headerHeight + (index * rowHeight) + padding, 'H', width + padding]).attr({...border_Attributes}).add() : null;//每条数据横线
        const y = headerHeight + index * rowHeight;//获取每行数据基础y值
        //循环表头
        header.forEach((head, headIndex) => {
          const x = headIndex * columnWidth;
          renderer.text(item[headIndex], x + M.x, y + M.y + 5, false).attr({...text_Attributes}).css({
            'font-size': '13px'
          }).add()
        })//每行数据按照列拆分并渲染每列数据
      });
    }

 实践中发现可以将表格所有内容添加到一个组里面,然后将组translate一次即可,组里面包含的子元素无需再一个个的translate了。

        if (this.chartTableGroup) {
            this.chartTableGroup.destroy();//销毁之前的group如果存在的话
        }
        const {M, L, H, V, Z} = SvgPath;
        this.chartTableGroup = renderer.g('CHART_DYNAMIC_TABLE_GROUP');
        this.chartTableGroup.translate(this.P.x, this.P.y);//坐标转换

 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Vue使用Highcharts绘制3D饼图,首先需要在你的项目安装vue-highcharts库,并在main.js引入HighchartsHighcharts-3D模块。可以按照以下步骤进行操作: 1. 使用npm在你的项目安装vue-highcharts库。 2. 在main.js引入HighchartsHighcharts-3D模块: import highcharts from 'highcharts' import highcharts3d from 'highcharts/highcharts-3d' highcharts3d(highcharts) 3. 在Vue组件使用vue-highcharts组件,并设置你的3D饼图的配置。 4. 参考上述的Vue教程来绘制3D饼图。 通过以上步骤,你就可以在Vue使用Highcharts绘制3D饼图了。请确保你已经正确安装了依赖库并按照引用和引用提供的方法进行配置。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [【highCharts绘制3d饼图】有、无高低差的3d饼图](https://blog.csdn.net/phhzhhh/article/details/125807211)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [vue单页面使用 highcharts 绘制3D饼图](https://blog.csdn.net/qq_46566911/article/details/121280786)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值