**Django+Echart实现多个饼状图(echart数据格式问题 {value: 135, name: '视频广告'})

1.直接上代码:

option = {
    backgroundColor: '#f7f7f7',//背景颜色
    tooltip : {
        show: true,
        formatter: "{a} <br/>{b} : {c} ({d}%)"
    },
    title: [
            {
              text: 'Other占比饼状图',
              top: '4%',
              left:'39%',
              textStyle:{
                  color:'#d1ecff',
                  fontStyle:'normal',
                  fontWeight:'600',
                  fontFamily:'sans-serif',
                fontSize:25
              }
            },
            {
              text: '不同楼层房屋占比饼状图',
              top: '15%',
              left:'8%',
              textStyle:{
                  color:'#d1ecff',
                  fontStyle:'normal',
                  fontWeight:'600',
                  fontFamily:'sans-serif',
              fontSize:18
              }
          },{
              text: "不同户型房屋占比饼状图",
              top:'15%',
              left:'39%',
              textStyle:{
                  color:'#ccc',
                  fontStyle:'normal',
                  fontWeight:'600',
                  fontFamily:'sans-serif',
                  fontSize:18
              }
          },
          {
              text: "不同房屋朝向占比饼状图",
              top: '15%',
              left: '69%',
              textStyle:{
                  color:'#ccc',
                  fontStyle:'normal',
                  fontWeight:'600',
                  fontFamily:'sans-serif',
                  fontSize:18
              }
          },
          {
              text: '不同装修房屋占比饼状图',
              top: '55%',
              left:'8%',
              textStyle:{
                  color:'#d1ecff',
                  fontStyle:'normal',
                  fontWeight:'600',
                  fontFamily:'sans-serif',
              fontSize:18
              }
          },{
              text: "房屋有无电梯占比饼状图",
              top:'55%',
              left:'39%',
              textStyle:{
                  color:'#ccc',
                  fontStyle:'normal',
                  fontWeight:'600',
                  fontFamily:'sans-serif',
                  fontSize:18
              }
          },
          {
              text: "不同房屋类型占比饼状图",
              top: '55%',
              left: '69%',
              textStyle:{
                  color:'#ccc',
                  fontStyle:'normal',
                  fontWeight:'600',
                  fontFamily:'sans-serif',
                  fontSize:18
              }
          }],

    toolbox: {
        show : false,
        feature : {
            mark : {show: true},
            dataView : {show: true, readOnly: false},
            restore : {show: true},
            saveAsImage : {show: true}
        }
    },
    calculable:false,
    series : [
        {
            name:'报警数占比',
            type:'pie',
            center: ['20%', '35%'],
            radius: [0, '25%'],
            data:[{name:'a0',value:114},
                {name:'b0',value:100},
                {name:'c0',value:240}],
            itemStyle: {//系列级个性化
                normal: {
                    color: function(params) {
                        var colorList = [
                          '#339CD1','#FE8463','#9BCA63','#FAD860',
                           '#9CD2ED','#F8AB96','#80BF35','#F3C72C','#C1232B'
                        ];
                        return colorList[params.dataIndex]
                    },
                    labelLine:{//饼图不显示线条
                        length:2,
                        show:false
                    },
                    label:{//饼图不显示文字
                        show:true,
                        position : 'inner',//饼图图上显示百分比
                        formatter : function (params) {
                          return (params.percent - 0).toFixed(0) + '%'
                        },
                        textStyle:{
                            fontSize:14
                        }
                    },
                }
            }
        },
        {
            name:'掉线数占比',
            type:'pie',
            center: ['50%', '35%'],
            radius: [0, '25%'],
            data:[{name:'a1',value:45},
                {name:'b1',value:54},
                {name:'c1',value:23}],
            itemStyle: {//系列级个性化
                normal: {
                    color: function(params) {
                        var colorList = [
                          '#339CD1','#FE8463','#9BCA63','#FAD860',
                           '#9CD2ED','#F8AB96','#80BF35','#F3C72C','#C1232B'
                        ];
                        return colorList[params.dataIndex]
                    },
                    labelLine:{//饼图不显示线条
                        length:2,
                        show:false
                    },
                    label:{//饼图不显示文字
                        show:true,
                        position : 'inner',//饼图图上显示百分比
                        formatter : function (params) {
                          return (params.percent - 0).toFixed(0) + '%'
                        },
                        textStyle:{
                            fontSize:14
                        }
                    }
                }
            }
        },
        {
            name:'掉线数占比',
            type:'pie',
            center: ['80%', '35%'],
            radius: [0, '25%'],
            data:[{name:'a2',value:76},
                {name:'b2',value:56},
                {name:'c2',value:97}],
            itemStyle: {//系列级个性化
                normal: {
                    color: function(params) {
                        var colorList = [
                          '#339CD1','#FE8463','#9BCA63','#FAD860',
                           '#9CD2ED','#F8AB96','#80BF35','#F3C72C','#C1232B'
                        ];
                        return colorList[params.dataIndex]
                    },
                    labelLine:{//饼图不显示线条
                        length:2,
                        show:false
                    },
                    label:{//饼图不显示文字
                        show:true,
                        position : 'inner',//饼图图上显示百分比
                        formatter : function (params) {
                          return (params.percent - 0).toFixed(0) + '%'
                        },
                        textStyle:{
                            fontSize:14
                        }
                    }
                }
            }
        },
        {
            name:'掉线数占比',
            type:'pie',
            center: ['20%', '75%'],
            radius: [0, '25%'],
            data:[{name:'a3',value:34},
                {name:'b3',value:40},
                {name:'c3',value:40}],
            itemStyle: {//系列级个性化
                normal: {
                    color: function(params) {
                        var colorList = [
                          '#339CD1','#FE8463','#9BCA63','#FAD860',
                           '#9CD2ED','#F8AB96','#80BF35','#F3C72C','#C1232B'
                        ];
                        return colorList[params.dataIndex]
                    },
                    labelLine:{//饼图不显示线条
                        length:2,
                        show:false
                    },
                    label:{//饼图不显示文字
                        show:true,
                        position : 'inner',//饼图图上显示百分比
                        formatter : function (params) {
                          return (params.percent - 0).toFixed(0) + '%'
                        },
                        textStyle:{
                            fontSize:14
                        }
                    }
                }
            }
        },
        {
            name:'掉线数占比',
            type:'pie',
            center: ['50%', '75%'],
            radius: [0, '25%'],
            data:[{name:'a4',value:12},
                {name:'b4',value:20},
                {name:'c4',value:14}],
            itemStyle: {//系列级个性化
                normal: {
                    color: function(params) {
                        var colorList = [
                          '#339CD1','#FE8463','#9BCA63','#FAD860',
                           '#9CD2ED','#F8AB96','#80BF35','#F3C72C','#C1232B'
                        ];
                        return colorList[params.dataIndex]
                    },
                    labelLine:{//饼图不显示线条
                        length:2,
                        show:false
                    },
                    label:{//饼图不显示文字
                        show:true,
                        position : 'inner',//饼图图上显示百分比
                        formatter : function (params) {
                          return (params.percent - 0).toFixed(0) + '%'
                        },
                        textStyle:{
                            fontSize:14
                        }
                    }
                }
            }
        },
        {
            name:'掉线数占比',
            type:'pie',
            center: ['80%', '75%'],
            radius: [0, '25%'],
            data:[{name:'a5',value:314},
                {name:'b5',value:200},
                {name:'c5',value:140}],
            itemStyle: {//系列级个性化
                normal: {
                    color: function(params) {
                        var colorList = [
                          '#339CD1','#FE8463','#9BCA63','#FAD860',
                           '#9CD2ED','#F8AB96','#80BF35','#F3C72C','#C1232B'
                        ];
                        return colorList[params.dataIndex]
                    },
                    labelLine:{//饼图不显示线条
                        length:2,
                        show:false
                    },
                    label:{//饼图不显示文字
                        show:true,
                        position : 'inner',//饼图图上显示百分比
                        formatter : function (params) {
                          return (params.percent - 0).toFixed(0) + '%'
                        },
                        textStyle:{
                            fontSize:14
                        }
                    }
                }
            }
        },

    ]
};

在echart运行中显示:

 

 

echart代码有了,我们需结合django+数据分析的代码应用到echart中,

1.得到数据分析的数据是series数据类型

  

从echart要求的数据格式是如类型:

 

 

2.把series数据类型转为字典格式

##部分数据分析代码

s = ("name","values")    #定义键
# print(count_by_floor.index.tolist(),count_by_floor.values)
d1 = [count_by_floor, new_count_by_model,new_count_by_forword, count_by_zx_extent,count_by_lift,count_by_home_tpye]
for dd in d1:       #遍历数据
    l = []
    pp = dd.to_dict()       #转为字典 如 {'中层': 2421, '低层': 1660, '高层': 1918}
    oo = zip(pp.keys(),pp.values())     #把字典转为元组    (('中层', 2421), ('低层', 1660), ('高层', 1918))
    for i in oo:
        l.append(dict(zip(s,i)))        #使用zip函数跟键结合并放入列表  [{'name': '中层', 'values': 2421}, {'name': '低层', 'values': 1660}, {'name': '高层', 'values': 1918}]
    list_all.append(l)              #放入大列表

大列表list_all

 

 发现得到的数据跟echart的格式还是不一样,echart的格式很像字典,但它的键没有引号,在处理这点上花费了很长时间,起初想在数据分析代码中把引号去掉,报的是 不是字典的错误,然后换思路,换到view中去处理

view代码:

#部分代码

#other
        other_all = other()     #接收大列表
        #把大列表转为字符串再去把值替换
        other_all = str(other_all).replace("'name'","name").replace("'values'","values")
        print(other_all)

        return render(request, 'mainpage/index.html', locals())

可以输出结果

 但是格式是字符串,在templates只能显示一串字符,不能以列表去读取每个元素,所以我们可以在view中遍历other_all大列表,把小列表转为字符串,重新生成大列表other_l

 

 这样templates就可以接收参数了

得到图表

 

 这里关于图表的文字显示跟百分比不能同时显示(没有更深的了解),我使用的是两个图表进行叠加的效果,例:

 

第一个:

 

 

 第二个:

 

 没有设置itemstyle则默认显示文字加线条

echart完整代码:

<div class="row">
<div class="col-md-9" align="center">
    <div id="main3" style="width: 1080px;height:640px;"></div>
    <script type="text/javascript">
        var myChart = echarts.init(document.getElementById('main3'));
        option = {
            backgroundColor: '#f7f7f7',//背景颜色
            tooltip : {
                show: true,
                formatter: "{a} <br/>{b} : {c} ({d}%)"
            },
            title: [
                    {
                      text: 'Other占比饼状图',
                      top: '4%',
                      left:'39%',
                      textStyle:{
                          color:'#d1ecff',
                          fontStyle:'normal',
                          fontWeight:'600',
                          fontFamily:'sans-serif',
                        fontSize:25
                      }
                    },
                    {
                      text: '不同楼层房屋占比饼状图',
                      top: '15%',
                      left:'9%',
                      textStyle:{
                          color:'#d1ecff',
                          fontStyle:'normal',
                          fontWeight:'600',
                          fontFamily:'sans-serif',
                      fontSize:18
                      }
                  },{
                      text: "不同户型房屋占比饼状图",
                      top:'15%',
                      left:'40%',
                      textStyle:{
                          color:'#ccc',
                          fontStyle:'normal',
                          fontWeight:'600',
                          fontFamily:'sans-serif',
                          fontSize:18
                      }
                  },
                  {
                      text: "不同房屋朝向占比饼状图",
                      top: '15%',
                      left: '70%',
                      textStyle:{
                          color:'#ccc',
                          fontStyle:'normal',
                          fontWeight:'600',
                          fontFamily:'sans-serif',
                          fontSize:18
                      }
                  },
                  {
                      text: '不同装修房屋占比饼状图',
                      top: '55%',
                      left:'9%',
                      textStyle:{
                          color:'#d1ecff',
                          fontStyle:'normal',
                          fontWeight:'600',
                          fontFamily:'sans-serif',
                      fontSize:18
                      }
                  },{
                      text: "房屋有无电梯占比饼状图",
                      top:'55%',
                      left:'40%',
                      textStyle:{
                          color:'#ccc',
                          fontStyle:'normal',
                          fontWeight:'600',
                          fontFamily:'sans-serif',
                          fontSize:18
                      }
                  },
                  {
                      text: "不同房屋类型占比饼状图",
                      top: '55%',
                      left: '70%',
                      textStyle:{
                          color:'#ccc',
                          fontStyle:'normal',
                          fontWeight:'600',
                          fontFamily:'sans-serif',
                          fontSize:18
                      }
                  }],

            toolbox: {
                show : false,
                feature : {
                    mark : {show: true},
                    dataView : {show: true, readOnly: false},
                    restore : {show: true},
                    saveAsImage : {show: true}
                }
            },
            calculable:false,
            series : [
                {
                    name:'房屋楼层占比',
                    type:'pie',
                    center: ['20%', '35%'],
                    radius: [0, '25%'],
                    data: {{ other_l.0|safe }},
                    itemStyle: {//系列级个性化
                        normal: {
                            color: function(params) {
                                var colorList = [
                                  '#339CD1','#FE8463','#9BCA63','#FAD860',
                                   '#9CD2ED','#F8AB96','#80BF35','#F3C72C','#C1232B'
                                ];
                                return colorList[params.dataIndex]
                            },
                            labelLine:{//饼图不显示线条
                                length:2,
                                show:false
                            },
                            label:{//饼图不显示文字
                                show:true,
                                position : 'inner',//饼图图上显示百分比
                                formatter : function (params) {
                                  return (params.percent - 0).toFixed(0) + '%'
                                },
                                textStyle:{
                                    fontSize:14
                                }
                            },
                        }
                    }
                },
                {
                    name:'房屋楼层占比',
                    type:'pie',
                    center: ['20%', '35%'],
                    radius: [0, '25%'],
                    data: {{ other_l.0|safe }},
                },
                {
                    name:'房屋户型占比',
                    type:'pie',
                    center: ['50%', '35%'],
                    radius: [0, '25%'],
                    data:{{ other_l.1|safe }},
                    itemStyle: {//系列级个性化
                        normal: {
                            color: function(params) {
                                var colorList = [
                                  '#339CD1','#FE8463','#9BCA63','#FAD860',
                                   '#9CD2ED','#F8AB96','#80BF35','#F3C72C','#C1232B'
                                ];
                                return colorList[params.dataIndex]
                            },
                            labelLine:{//饼图不显示线条
                                length:2,
                                show:false
                            },
                            label:{//饼图不显示文字
                                show:true,
                                position : 'inner',//饼图图上显示百分比
                                formatter : function (params) {
                                  return (params.percent - 0).toFixed(0) + '%'
                                },
                                textStyle:{
                                    fontSize:14
                                }
                            }
                        }
                    }
                },
                {
                    name:'房屋户型占比',
                    type:'pie',
                    center: ['50%', '35%'],
                    radius: [0, '25%'],
                    data:{{ other_l.1|safe }}
                },
                {
                    name:'房屋朝向占比',
                    type:'pie',
                    center: ['80%', '35%'],
                    radius: [0, '25%'],
                    data:{{ other_l.2|safe }},
                    itemStyle: {//系列级个性化
                        normal: {
                            color: function(params) {
                                var colorList = [
                                  '#339CD1','#FE8463','#9BCA63','#FAD860',
                                   '#9CD2ED','#F8AB96','#80BF35','#F3C72C','#C1232B'
                                ];
                                return colorList[params.dataIndex]
                            },
                            labelLine:{//饼图不显示线条
                                length:2,
                                show:false
                            },
                            label:{//饼图不显示文字
                                show:true,
                                position : 'inner',//饼图图上显示百分比
                                formatter : function (params) {
                                  return (params.percent - 0).toFixed(0) + '%'
                                },
                                textStyle:{
                                    fontSize:14
                                }
                            }
                        }
                    }
                },
                {
                    name:'房屋朝向占比',
                    type:'pie',
                    center: ['80%', '35%'],
                    radius: [0, '25%'],
                    data:{{ other_l.2|safe }},
                },
                {
                    name:'房屋装修占比',
                    type:'pie',
                    center: ['20%', '75%'],
                    radius: [0, '25%'],
                    data:{{ other_l.3|safe }},
                    itemStyle: {//系列级个性化
                        normal: {
                            color: function(params) {
                                var colorList = [
                                  '#339CD1','#FE8463','#9BCA63','#FAD860',
                                   '#9CD2ED','#F8AB96','#80BF35','#F3C72C','#C1232B'
                                ];
                                return colorList[params.dataIndex]
                            },
                            labelLine:{//饼图不显示线条
                                length:2,
                                show:false
                            },
                            label:{//饼图不显示文字
                                show:true,
                                position : 'inner',//饼图图上显示百分比
                                formatter : function (params) {
                                  return (params.percent - 0).toFixed(0) + '%'
                                },
                                textStyle:{
                                    fontSize:14
                                }
                            }
                        }
                    }
                },
                {
                    name:'房屋装修占比',
                    type:'pie',
                    center: ['20%', '75%'],
                    radius: [0, '25%'],
                    data:{{ other_l.3|safe }},
                },
                {
                    name:'有无电梯占比',
                    type:'pie',
                    center: ['50%', '75%'],
                    radius: [0, '25%'],
                    data:{{ other_l.4|safe }},
                    itemStyle: {//系列级个性化
                        normal: {
                            color: function(params) {
                                var colorList = [
                                  '#339CD1','#FE8463','#9BCA63','#FAD860',
                                   '#9CD2ED','#F8AB96','#80BF35','#F3C72C','#C1232B'
                                ];
                                return colorList[params.dataIndex]
                            },
                            labelLine:{//饼图不显示线条
                                length:2,
                                show:false
                            },
                            label:{//饼图不显示文字
                                show:true,
                                position : 'inner',//饼图图上显示百分比
                                formatter : function (params) {
                                  return (params.percent - 0).toFixed(0) + '%'
                                },
                                textStyle:{
                                    fontSize:14
                                }
                            }
                        }
                    }
                },
                {
                    name:'有无电梯占比',
                    type:'pie',
                    center: ['50%', '75%'],
                    radius: [0, '25%'],
                    data:{{ other_l.4|safe }},
                },
                {
                    name:'房屋类型占比',
                    type:'pie',
                    center: ['80%', '75%'],
                    radius: [0, '25%'],
                    data:{{ other_l.5|safe }},
                    itemStyle: {//系列级个性化
                        normal: {
                            color: function(params) {
                                var colorList = [
                                  '#339CD1','#FE8463','#9BCA63','#FAD860',
                                   '#9CD2ED','#F8AB96','#80BF35','#F3C72C','#C1232B'
                                ];
                                return colorList[params.dataIndex]
                            },
                            labelLine:{//饼图不显示线条
                                length:2,
                                show:false
                            },
                            label:{//饼图不显示文字
                                show:true,
                                position : 'inner',//饼图图上显示百分比
                                formatter : function (params) {
                                  return (params.percent - 0).toFixed(0) + '%'
                                },
                                textStyle:{
                                    fontSize:14
                                }
                            }
                        }
                    }
                },
                {
                    name:'房屋类型占比',
                    type:'pie',
                    center: ['80%', '75%'],
                    radius: [0, '25%'],
                    data:{{ other_l.5|safe }},
                },

            ]
        };
        //使用刚指定的配置项和数据显示图表
        myChart.setOption(option);

    </script>
</div>
</div>

 

之后查了资料,可以通过eval()函数来实现字符串转列表的形式

 

 结果转换的时候就报了个格式错误,跟在数据分析代码的错误差不多。

然后又查了在templates中自定义过滤器,还没弄懂,弄懂了在写。


posted @ 2020-04-02 13:28  cmap  阅读(1609)  评论(0编辑  收藏  举报