前后端分离 使用pyecharts踩坑日记

pyechart的官方文档:
https://pyecharts.org/#/zh-cn/intro

加载百分比的时候页面渲染的bug:
在这里插入图片描述
视图代码:
在这里插入图片描述

        print("yaxis_dict______>",yaxis_dict)
        yaxis_values = list(yaxis_dict.values())
        sum_list = list(np.array(yaxis_values).sum(axis=0, dtype=int))  # 二维数组每列求和

        sum_l = []
        for i in yaxis_values:
            print(i)
            d = [{"value": k, "percent": round(k / sum_list[i_index], 2)} for i_index, k in enumerate(i)]
            sum_l.append(d)

        c = Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
        c = c.add_xaxis(legend_x_list)
        for i, d in enumerate(yaxis_dict):
            c = c.add_yaxis(d, sum_l[i], stack="stack1", category_gap="50%")
        c = c.set_series_opts(
                label_opts=opts.LabelOpts(
                    position="inside",
                    formatter=JsCode(
                        "function(x){return Number(x.data.percent * 100).toFixed() + '%';}"
                    ),
                )
            )
        c = c.set_global_opts(
            title_opts=opts.TitleOpts(title="百分比堆积柱状图 ", subtitle="我是副标题"),
            datazoom_opts=[opts.DataZoomOpts(), opts.DataZoomOpts(type_="inside")],     # 区域缩放配置项
            # visualmap_opts=[opts.VisualMapOpts()],                                      # 视觉映射配置项
            toolbox_opts=[opts.ToolboxOpts()],      # 工具类
            )

        c = c.dump_options_with_quotes()
        print(c)
        return JsonResponse(json.loads(c))

前端代码:
前端用的vue+element ui

<script>
 show_chart() {


                    axios.defaults.headers.post['X-CSRFToken'] = '{{ csrf_token }}'
                    axios.post(BASE_URL + '/show_chart/', {
                        t_name: this.value,
                        legend_v: this.legend_v,
                        //legend_v:[['过去一年读课外书量', 2], ['过去一年读课外书量', 3]],
                        legend_x: this.value_p,
                        //legend_x: '省',
                        chart_value: this.chart_value,
                    })
                        .then((res) => {
                            console.log(res.data)
                            // echarts.init(document.getElementById('bar')).dispose();             // 销毁上一个实例
                            let chart = echarts.init(document.getElementById('bar'), 'white', {renderer: 'canvas'});
                            chart.setOption(res.data);

                        })
                        .catch((error) => {
                            this.$message({
                                message: '选项没有选择完呢! 亲~',
                                type: 'warning'
                            });
                        })

                },
    </script>

解决代码:

<script>
 show_chart() {


                    axios.defaults.headers.post['X-CSRFToken'] = '{{ csrf_token }}'
                    axios.post(BASE_URL + '/show_chart/', {
                        t_name: this.value,
                        legend_v: this.legend_v,
                        //legend_v:[['过去一年读课外书量', 2], ['过去一年读课外书量', 3]],
                        legend_x: this.value_p,
                        //legend_x: '省',
                        chart_value: this.chart_value,
                    })
                        .then((res) => {
                    if (res.data.series[0].label.formatter === "function(x){return Number(x.data.percent * 100).toFixed() + '%';}"){
                                for (i in res.data.series){
                                    res.data.series[i].label.formatter = function(x){return Number(x.data.percent * 100).toFixed() + '%';}
                                    console.log(typeof res.data.series[i].label.formatter)


                                }
                            }
                            console.log(res.data)
                            // echarts.init(document.getElementById('bar')).dispose();             // 销毁上一个实例
                            let chart = echarts.init(document.getElementById('bar'), 'white', {renderer: 'canvas'});
                            chart.setOption(res.data);

                        })
                        .catch((error) => {
                            this.$message({
                                message: '选项没有选择完呢! 亲~',
                                type: 'warning'
                            });
                        })

                },
    </script>

在这里插入图片描述
小提醒:
前后端分离的时候,在每次生成可视化图形前记得销毁上一个实例呢,清空画布是没有用的!!!

代码如下:

echarts.init(document.getElementById('bar')).dispose();             // 销毁上一个实例

解决之后的图:
在这里插入图片描述

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值