django 和 pyecharts实现可视化大屏(完整代码)

news2024/11/24 11:25:45

1.配置settings文件

(1)注意:需要先创建app(djnago-admin startapp app名称)

(2)配置模板文件

        'DIRS': [os.path.join(BASE_DIR, 'templates')],

(3)配置静态文件(这里我由于存放清洗好的需要进行可视化的文件)

STATIC_URL = 'static/'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static')
]

2.配置主路由(path后面的为“”表示默认,假设有多个会直接跳转到默认的)

urlpatterns = [
    path('', include(('pro.urls', 'pro'), namespace='pro')),
]

3.app中的views文件

import pandas as pd
from django.shortcuts import HttpResponse, render, redirect
from pyecharts.charts import Page, Map3D, Pie, Line, Timeline, Radar
from pyecharts.components import Table
from pyecharts import options as opts
from pyecharts.commons.utils import JsCode
from pyecharts.globals import ChartType
from django.contrib import auth, messages
from django.contrib.auth.models import User

data = pd.read_csv('static/data/更新后的水质.csv')
data = pd.DataFrame(data)

fn = """
    function(params) {
        if(params.name == '其他')
            return '\\n\\n\\n' + params.name + ' : ' + params.value + '%';
        return params.name + ' : ' + params.value + '%';
    }
    """


def new_label_opts():
    return opts.LabelOpts(formatter=JsCode(fn), position="center")


def map_pro(request):
    # 2. 统计每个省份的水质类别总数
    province_counts = data.groupby('省份')['水质类别'].count().reset_index()
    province_counts['水质类别'] = province_counts['水质类别'].astype(int)

    # 3. 提取每个省份的第一个经纬度
    province_coords = data.groupby('省份').first()[['实测经度', '实测纬度']].reset_index()
    # 使用 merge 函数将两个 DataFrame 合并
    merged_data = pd.merge(province_counts, province_coords, on='省份')

    # 使用 apply 函数对每一行进行操作,转换为所需格式
    converted_data = merged_data.apply(lambda row: (row['省份'], [row['实测经度'], row['实测纬度'], row['水质类别']]),
                                       axis=1).tolist()
    print(converted_data)
    # 打印转换后的数据
    for item in converted_data:
        print(item)
    # 4. 绘制3D地图
    c = (
        Map3D(init_opts=opts.InitOpts(width="100%"))
            .add_schema(
            itemstyle_opts=opts.ItemStyleOpts(
                color="rgb(5,101,123)",
                opacity=1,
                border_width=0.8,
                border_color="rgb(62,215,213)",
            ),
            map3d_label=opts.Map3DLabelOpts(
                is_show=False,
                formatter=JsCode("function(data){return data.name + " " + data.value[2];}"),
            ),
            emphasis_label_opts=opts.LabelOpts(
                is_show=False,
                color="#fff",
                font_size=10,
                background_color="rgba(0,23,11,0)",
            ),
            light_opts=opts.Map3DLightOpts(
                main_color="#fff",
                main_intensity=1.2,
                main_shadow_quality="high",
                is_main_shadow=False,
                main_beta=10,
                ambient_intensity=0.3,
            ),
        )
            .add(
            series_name="质量分布情况",
            data_pair=converted_data,
            type_=ChartType.SCATTER3D,
            bar_size=1,
            shading="lambert",
            label_opts=opts.LabelOpts(
                is_show=False,
                formatter=JsCode("function(data){return data.name + ' ' + data.value[2];}"),
            ),
        )
            .set_global_opts(visualmap_opts=opts.VisualMapOpts(is_show=False, max_=700),
                             legend_opts=opts.LegendOpts(textstyle_opts=opts.TextStyleOpts(color='#ededed')))
    )

    return HttpResponse(c.render_embed())


def pie_pro(request):
    water_type = data.groupby('水质类别').size().reset_index(name='数量')
    water_sum = sum(water_type['数量'])
    print(water_type['水质类别'][4], water_type['数量'][4])

    # for index, row in water_type[['水质类别', '数量']].iterrows():
    #     lis_col.append([row['水质类别'], '其他'])
    #     lis_other.append([row['数量'], water_sum])

    p = (
        Pie(init_opts=opts.InitOpts(width="100%"))
            .add(
            "",
            [list(z) for z in zip(water_type['水质类别'][:3], water_type['数量'][:3])],
            center=["20%", "30%"],
            radius=[28, 40],
        )
            .add(
            "",
            [list(z) for z in zip([water_type['水质类别'][4], "其他"], [int(water_type['数量'][4]), water_sum])],
            center=["38%", "30%"],
            radius=[28, 40],
            label_opts=new_label_opts(),
        )
            .add(
            "",
            [list(z) for z in zip([water_type['水质类别'][3], "其他"], [int(water_type['数量'][3]), water_sum])],
            center=["56%", "30%"],
            radius=[28, 40],
            label_opts=new_label_opts(),
        )
            .set_global_opts(
            title_opts=opts.TitleOpts(title="水质类别占比", pos_top='20px', pos_left='20px',
                                      title_textstyle_opts=opts.TextStyleOpts(color='#FFF', font_size=16)),
            legend_opts=opts.LegendOpts(
                type_="scroll", pos_top="20%", pos_left="80%", orient="vertical", is_show=False,
                textstyle_opts=opts.TextStyleOpts(color='#FFF')
            ),

        )
            .set_series_opts(label_opts=opts.LabelOpts(color='#FFF'))
        # .render('templates/pie.html')
    )
    return HttpResponse(p.render_embed())


def line_pro(request):
    grouped_data = data.groupby(['省份', '监测时间', '水质类别']).size().reset_index(name='数量')
    # 将监测时间的类型更改为日期时间类型
    grouped_data['监测时间'] = pd.to_datetime(grouped_data['监测时间'])
    # 格式化日期时间为年份和月份,并存储到新的列中
    grouped_data['年月'] = grouped_data['监测时间'].dt.strftime('%Y-%m')

    # 获取时间列表
    dates = grouped_data['年月'].unique()

    # 创建时间轴组件
    timeline = Timeline(init_opts=opts.InitOpts(width='350px', height='290px'))

    for date in dates:
        # 获取该时间点的数据
        data_by_date = grouped_data[grouped_data['年月'] == date]

        # 创建折线图
        line_chart = Line()

        # 添加四种水质类别的数据
        for water_type in ['一类', '二类', '三类', '四类']:
            water_data = data_by_date[data_by_date['水质类别'] == water_type]
            line_chart.add_xaxis(water_data['省份'].tolist())
            line_chart.add_yaxis(water_type, water_data['数量'].tolist(), is_smooth=True, linestyle_opts={
                'normal': {
                    'width': 3,
                    'shadowColor': '#696969',
                    'shadowBlur': 10,
                    'shadowOffsetY': 10,
                    'shadowOffsetx': 10,
                    'curve': 10
                }
            })

        line_chart.set_global_opts(
            title_opts=opts.TitleOpts(title="水质类别数量随时间变化"),
            xaxis_opts=opts.AxisOpts(type_="category"),
            yaxis_opts=opts.AxisOpts(type_="value"),
        )
        line_chart.set_global_opts(title_opts=opts.TitleOpts(title='各类监测水质时间',
                                                             title_textstyle_opts=opts.TextStyleOpts(color='#FFF',
                                                                                                     font_size=16),

                                                             pos_left='left'),
                                   xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(is_show=True, color="pink")),
                                   yaxis_opts=opts.AxisOpts(
                                       axislabel_opts=opts.LabelOpts(color='#F37282', is_show=True),
                                       splitline_opts=opts.SplitLineOpts(is_show=True,
                                                                         linestyle_opts=opts.LineStyleOpts(
                                                                             type_='dashed',
                                                                             color='#F37282')),
                                       axisline_opts=opts.AxisLineOpts(
                                           linestyle_opts=opts.LineStyleOpts(color='#FFFFFF'))),
                                   tooltip_opts=opts.TooltipOpts(axis_pointer_type='shadow'),
                                   legend_opts=opts.LegendOpts(pos_top='30px',
                                                               textstyle_opts=opts.TextStyleOpts(color='#FFF'))
                                   )
        line_chart.set_series_opts(label_opts=opts.LabelOpts(color="#3CA6DE"))

        # 将折线图添加到时间轴组件中
        timeline.add(line_chart, date)
        timeline.add_schema(
            # axis_type='time',  # axis_type表示时间轴类型,值可以是value(连续数值型)、category(离散型)、time(时间),如果是time,程序会自动计算时间间隔选择合适的显示格式
            play_interval=1000,  # 表示播放的速度(跳动的间隔),单位毫秒(ms)
            is_auto_play=True,  # 设置自动播放
            is_timeline_show=True,  # 不展示时间组件的轴
            width='310px',
            pos_left='1px',
            is_loop_play=True  # 是否循环播放

        )

    return HttpResponse(timeline.render_embed())


def table_pro(request):
    # 创建 Table 组件实例

    table = Table()

    # 从数据中筛选出水质类别为“劣四类”的行
    low_four = data[data['水质类别'] == '劣四类']

    # 对省份进行分组,并求劣四类数量的总和
    low_four_sum = low_four.groupby(['省份', '海区']).agg({'水质类别': 'count', 'pH': 'sum'}).reset_index()

    # 按照劣四类数量的总和对省份进行降序排序
    low_four_sum = low_four_sum.sort_values(by='水质类别', ascending=False)
    low_four_sum = low_four_sum.rename(columns={'水质类别': '水质-劣四类'})

    # 将数据转换为二维数组形式
    rows = low_four_sum.values.tolist()

    # 添加
    table.add(headers=low_four_sum.columns.tolist(), rows=rows,
              attributes={'align': 'left',
                          "style": "color:#3CA6DE;width:350px;height:500px; "
                                   "font-size: 16px; padding:10px;text-align:center;border-collapse: collapse;"})

    # 设置全局配置
    table.set_global_opts(
        {'title': '重点关注劣四类水资源', 'title_style': "style='color:#FFF';style='font-size:30px'"},
    )
    # table.render('templates/table.html')
    return HttpResponse(table.render_embed())


def radar_pro(request):
    sum_time = data.groupby(['省份', '监测时间']).size().reset_index(name='总数')

    # 提取省份和监测时间数据
    provinces = sum_time['省份'].unique()
    times = sum_time['监测时间'].unique()

    # 创建雷达图实例
    radar = Radar(init_opts=opts.InitOpts(width='330px', height='500px'))

    # 添加雷达图的 schema,将时间作为标签
    radar.add_schema(
        schema=[
            opts.RadarIndicatorItem(name=time, max_=sum_time[sum_time['省份'] == time]['总数'].max()) for time in provinces
        ],

        splitarea_opt=opts.SplitAreaOpts(is_show=False),  # 不显示分割区域
    )

    # 添加数据到雷达图
    color_list = ['#FF4500', '#4169E1', '#32CD32', '#FFD700', '#BA55D3', '#4682B4', '#FFA07A', '#87CEEB', '#20B2AA',
                  '#FF69B4']  # 颜色列表
    for i, province in enumerate(times):
        province_data = sum_time[sum_time['监测时间'] == province]['总数'].tolist()
        color = color_list[i % len(color_list)]  # 循环使用颜色列表
        radar.add(
            series_name=province,  # 省份作为标签
            data=[province_data],
            linestyle_opts=opts.LineStyleOpts(width=2),
            areastyle_opts=opts.AreaStyleOpts(opacity=0.2),
            color=color,
        )

    # 设置雷达图全局配置
    radar.set_global_opts(
        title_opts=opts.TitleOpts(title="水质量分布情况",
                                  title_textstyle_opts=opts.TextStyleOpts(color='#FFF', font_size=16)),
        legend_opts=opts.LegendOpts(pos_top='35px', textstyle_opts=opts.TextStyleOpts(color="#FFF"))
    )
    radar.set_series_opts(label_opts=opts.LabelOpts(color='#3CA6DE'), linestyle_opts=opts.LineStyleOpts(color='pink'))

    return HttpResponse(radar.render_embed())


def pic_all(request):
    return render(request, 'index.html')


def login(request):
    if request.method == "GET":
        return render(request, "login.html")
    if request.method == "POST":
        username = request.POST.get("username")
        password = request.POST.get("password")
        print(username, password, 11111)
        # 必须同时传入账户和密码
        user = auth.authenticate(username=username, password=password)
        # 验证
        if user:
            print('a')
            auth.login(request, user)
            return redirect("pro:looking")
        else:
            messages.add_message(request, messages.WARNING, "用户名或密码错误")
            return render(request, "login.html", locals())

    return render(request, "login.html")

4.查看效果图

有其他问题可私信

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1865515.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Java+MySQL停车场车位管理系统详细设计和实现(源码+LW+调试文档+讲解等)

💗博主介绍:✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者,博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,…

基于51单片机密码锁—六位密码LCD1602显示

基于51单片机密码锁设计 (仿真+程序+设计报告) 功能介绍 具体功能: 1.密码为六位数字,有键按下,LCD1602就会显示出字符 “*”; 2.当用户键入正确密码后,再按确认键&a…

HistoQC|病理切片的质量控制工具

小罗碎碎念 这期推文介绍的内容,我相信研究病理组学的人,一定都非常熟悉——HistoQC——病理切片的质量控制。 之前写过Hover Net系列的推文,反响还可以,但是Hover Net是用于细胞核检测和分类的,直接从这里开始还不够系…

应用程序任务驱动:详细解析LLM的评估指标

在自然语言处理(NLP)的动态环境中,大型语言模型(LM)性能的评估是衡量其在各种下游应用程序中的有效性的关键因素。不同的应用程序需要与其目标一致的不同性能指标。本文将详细介绍各种LLM评估指标,探索它们如何应用于实际场景。 从传统的摘要任务到更细…

华三中小企业组网

一、组网需求 在中小园区中,S5130系列或S5130S系列以太网交换机通常部署在网络的接入层,S5560X系列或 S6520X系列以太网交换机通常部署在网络的核心,出口路由器一般选用MSR系列路由器。 核心交换机配置VRRP保证网络可靠性。园区网中不同的…

python flask 入门-helloworld

学习视频链接: 01-【前奏】课程介绍_哔哩哔哩_bilibili 1.安装flask pip install flask 踩坑记:本机不要连代理,否则无法install 提示报错valueError: check_hostname requires server_hostname 2.程序编写 在根目录下创建 app.py fr…

深入探讨C++的高级反射机制(2):写个能用的反射库

在现代软件开发中,反射是一种强大的特性,它可以支持程序在运行时查询和调用对象的属性和方法。 但是在C中,没有内置的反射机制。我们可以通过一些巧妙的技术模拟反射的部分功能。 上一篇文章写了个简单的反射功能,这回完善一下&a…

Linux-笔记 OverlayFS文件系统入门

目录 前言 主要概念 工作原理 特点特性 1、上下合并 2、同名文件覆盖 3、同名目录合并 4、写时拷贝 实操入门 内核配置 挂载文件系统 验证 1、同名文件覆盖 2、同名目录合并 3、写时拷贝 1)验证新增文件或目录 2)验证修改文件 3&…

[leetcode]assign-cookies. 分发饼干

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {sort(g.begin(), g.end());sort(s.begin(), s.end());int m g.size(), n s.size();int count 0;for (int i 0, j 0; i…

【嵌入式Linux】i.MX6ULL GPIO 中断服务函数注册与编写

文章目录 1 外部中断初始化与中断服务函数1.2 外部中断初始化函数 exti_init1.2.1 GPIO引脚配置1.2.2 中断使能与注册1.2.3 GIC_EnableIRQ()函数的分析 1.3 中断服务函数 gpio1_io20_irqhandler1.3.1 消抖处理1.3.2 中断事件处理1.3.3 清除中断标志 2 BUG处理2.1 问题描述2.2 解…

【开源项目】自然语言处理领域的明星项目推荐:Hugging Face Transformers

在当今人工智能与大数据飞速发展的时代&#xff0c;自然语言处理&#xff08;NLP&#xff09;已成为推动科技进步的重要力量。而在NLP领域&#xff0c;Hugging Face Transformers无疑是一个备受瞩目的开源项目。本文将从项目介绍、代码解释以及技术特点等角度&#xff0c;为您深…

泰迪智能科技大数据挖掘企业服务平台典型合作案例介绍

泰迪大数据挖掘企业服务平台 是一款通用的、企业级、智能化的数据分析模型构建与数据应用场景设计工具&#xff0c;能够一体化地完成数据集成、模型构建、模型发布&#xff0c;为数据分析、探索、服务流程提供支撑&#xff0c;提供完整的数据探索、多数据源接入、特征处理、模型…

编程设计思想

健康检查脚本 nmap:扫描端口 while true do healthycurl B:httpPORT/healthy -i | grep HTTP/1.1 | tail -n 1 | awk {print $2} done 批量操作类型脚本&#xff08;记录每一步日志&#xff09; 将100个nginx&#xff1a;vn推送到harbor仓库192.168.0.100 根据镜像对比sha值…

高效修复机床导轨磨损,保障加工精度!

机床导轨是支承和引导运动构件沿着一定轨迹运动的传动装置&#xff0c;在机器设备中是个十分重要的部件&#xff0c;在机床中是常见的部件。机床的加工精度与导轨精度有直接的联系&#xff0c;且导轨一旦损坏&#xff0c;维修较复杂且困难。我们简单总结了以下几点对于机床导轨…

rocketMQ消息中间件,onMessage报错,MessageExt of onessage method is not supported

本地启动不会报错&#xff0c;生产者和消费者都运行的好好的&#xff0c;但是打包之后就不断的报错误&#xff0c; 起初以为是maven出现了问题&#xff0c;但是刷新和重写都不管用&#xff0c;并且打的jar包解压后发现类里 有这个类和方法。最后认为是打包出现问题 解决方式&am…

SEO之竞争对手研究

初创企业搭建网站的朋友看1号文章&#xff1b;想学习云计算&#xff0c;怎么入门看2号文章谢谢支持&#xff1a; 1、我给不会敲代码又想搭建网站的人建议 2、新手上云 竞争对手研究是市场竞争研究的重要部分&#xff0c;对判断特定关键词竞争程度及了解行业整体情况非常有价值。…

AutoStudio: 开源 AI 漫画创作神器

AutoStudio是一个用于生成系列连续且一致的图片系统&#xff0c;可用于漫画创作&#xff0c;其核心由四个 Agent 组成&#xff1a; 主题管理器&#xff1a;理解用户对话&#xff0c;跟踪角色信息。 布局生成器&#xff1a;确定图像中角色的位置。 监督者&#xff1a;给出改进…

昇思25天学习打卡营第3天|张量Tensor

张量Tensor 概念创建张量&#xff08;4种方式&#xff09;张量的属性张量索引张量运算Tensor与NumPy转换 概念 张量&#xff08;Tensor&#xff09;是一种特殊的数据结构&#xff0c;与数组和矩阵非常相似。张量是MindSpore网络运算中的基本数据结构。 创建张量&#xff08;4…

离线安装docker-v26.1.4,compose-v2.27.0

目录 ​编辑 1.我给大家准备好了提取即可 2.安装docker和compose 3.解压 4.切换目录 5.执行脚本 6.卸载docker和compose 7.执行命令 “如果您在解决类似问题时也遇到了困难&#xff0c;希望我的经验分享对您有所帮助。如果您有任何疑问或者想分享您的经历&#xff0c;…

【Academy】测试WebSockets安全漏洞Testing for WebSockets security vulnerabilities

测试WebSockets安全漏洞Testing for WebSockets security vulnerabilities 概述WebSockets是什么?HTTP和WebSockets有什么区别&#xff1f;如何建立WebSocket连接&#xff1f;WebSocket消息看起来像什么&#xff1f; 操纵WebSocket流量拦截和修改WebSocket消息重放和生成新的W…