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

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.查看效果图

有其他问题可私信

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构与算法笔记:高级篇 - 位图:如何实现网页爬虫中的URL去重功能?

概述 网页爬虫是搜索引擎中的非常重要的系统,复杂爬取几十亿、上百亿额度网页。爬虫的工作原理是,通过解析已经爬取网页中的网页链接,然后再爬取这些链接对应地网页。而同一个网页链接有可能被包含在多个页面中,这就会导致爬虫在…

测试开发是什么?为什么现在那么多公司都要招聘测试开发?

测试开发是一种软件开发过程中的一种角色,旨在提高软件质量并确保软件功能完善和稳定。测试开发人员负责编写和执行自动化测试脚本,创建测试工具和框架,以及与开发人员紧密合作,提供实时反馈和改进。 为什么现在那么多公司都要招…

RISC-V异常处理流程概述

RISC-V异常处理流程概述 一、RISC-V异常处理流程和异常委托1.1 异常处理流程1.2 异常委托二、RISC-V异常处理中软件相关内容2.1 异常处理准备工作2.2 异常处理函数2.3 Opensbi系统调用的注册三、参考资料一、RISC-V异常处理流程和异常委托 1.1 异常处理流程 发生异常时,首先…

聚乙烯醇(PVA)涂布型薄膜是高阻隔性包装材料 我国市场增长快速

聚乙烯醇(PVA)涂布型薄膜是高阻隔性包装材料 我国市场增长快速 聚乙烯醇(PVA)涂布型薄膜,是以其他塑料薄膜(主要是双向拉伸薄膜)为基材,以聚乙烯醇为涂料,经表面涂布后制…

如何从0构建一款类jest工具

Jest工作原理 Jest 是一个流行的 JavaScript 测试框架,特别适用于 React 项目,但它也可以用来测试任何 JavaScript 代码。Jest 能够执行用 JavaScript 编写的测试文件的原因在于其设计和内部工作原理。下面是 Jest 的工作原理及其内部机制的详细解释&…

C语言的学习发展路线(都是干货)

哈喽,大家好呀~我又回来了,前期比较忙,没有时间来更文,现在给大家推荐了一个C语言的学习路线,供大家一起学习啦! 1. 环境搭建与工具篇 选择编译器:常用的编译器有gcc、Clang、Visual Studio等。…

第一个Java程序--HalloWorld(记事本版)

一、开发步骤 1.编写 将 Java 代码编写到扩展名为 .java 的源文件中 class HelloChina{public static void main(String[] args){System.out.println("HelloWorld!");} } 2.编译 winr进入DOS操作系统,进入当前目录。(操作命令见《JAVA概述…

红酒哲学:品味流转时光,探寻生活之深邃奥秘

在繁华的都市中,我们时常被各种声音和色彩所包围,追求着速度与激情。然而,在这喧嚣之中,总有那么一刻,我们渴望静下心来,品味一份不同的宁静与深度。这时,一杯雷盛红酒便成了我们与内心对话的桥…

Ubuntu磁盘分区和挂载 虚拟机扩容 逻辑卷的创建和扩容保姆及教程

目录 1、VMware虚拟机Ubuntu20.04系统磁盘扩容 2、Linux的磁盘分区和挂载 3、创建逻辑卷和逻辑卷的扩容 1、VMware虚拟机Ubuntu20.04系统磁盘扩容 通过下图可以看出我们的根磁盘一共有20G的大小,现在我们把它扩容为30G 注:如果你的虚拟机有快照是无…

鸿萌数据迁移业务案例:为医药客户成功迁移重要科研数据

天津鸿萌科贸发展有限公司对 Windows 及 Linux 系统下的各类型备份及数据迁移业务积累了丰富的业务经验,可提供针对性的解决方案。 医药科研数据迁移成功案例 2024年6月初,天津某医药厂家埃尔法 workstation2020 服务器硬盘老化,为保证服务…

小白上手AIGC-基于PAI-DSW部署Stable Diffusion文生图Lora模型

小白上手AIGC-基于PAI-DSW部署Stable Diffusion文生图Lora模型 前言资源准备开启体验服务创建工作空间 部署服务创建DSW实例安装Diffusers启动WebUI 写在最后 前言 在上一篇博文小白上手AIGC-基于FC部署stable-diffusion 中,说到基于函数计算应用模板部署AIGC文生图…

这么精彩的排序算法,你确定不来看一下?

目录 1.交换函数: 2.三数取中: 一.插入排序: 二.希尔排序: 三.选择排序: 四.快速排序: 1.霍尔法(递归版): 2.挖坑法(递归版): 3.双指针…

智领全栈,模力全开|2024中国智算中心全栈技术大会,锐捷网络引爆智算网络新风潮

6月25日至27日,2024中国智算中心全栈技术大会暨展览会、第5届中国数据中心绿色能源大会暨第10届中国(上海)国际数据中心产业展览会在上海新国际博览中心隆重开幕。此次大会由CDCC和益企研究院主办,以“AI赋能,重构未来”为主题,吸…

重温react-06

开始 函数组件必然成为未来发展的趋势(个人见解),总之努力的去学习,才能赚更多的钱.加油呀! 函数组件的格式 import React from reactexport default function LearnFunction01() {return (<div>LearnFunction01</div>) }以上是函数式组件的组基本的方式 快捷生…

如何提高工业交换机的电源功耗?

工业交换机的电源功耗是指在工作状态下所消耗的能量。随着工业自动化技术的发展&#xff0c;工业交换机在生产和制造领域中扮演着至关重要的角色。它们通过连接各种设备和系统&#xff0c;实现信息的传输和处理&#xff0c;提高生产效率和质量。然而&#xff0c;工业交换机的大…

springAI孵化(二)

目录 一、spring AI 目的 二、spring AI 来源 三、sprig AI 是什么&#xff1f; 四、spring AI中的 概念 4.1、模型&#xff08;Models&#xff09; 4.2、提示&#xff08;Prompts&#xff09; 4.3、提示模板&#xff08;Prompt Templates&#xff09; 4.4、令 牌&…

你的企业“赚钱能力”,银行怎么看?聊聊税贷与票贷背后的门道

大家都听过“税贷”和“票贷”吧&#xff1f;特别是这两年&#xff0c;国家扶持中小微企业&#xff0c;这些名词更是火得不行。但你知道吗&#xff0c;税贷和票贷并不是只看税和票那么简单。今天&#xff0c;咱就来聊聊这背后的门道&#xff08;最后附上&#xff1a;企业信用贷…

ChatGPT的Mac客户端正式发布了!Mac用户有福了

ChatGPT的Mac客户端正式发布了&#xff01;Mac用户有福了 &#x1f389; 大家好&#xff0c;我是猫头虎&#xff0c;科技自媒体博主。今天我带来了一个超级重磅的消息 &#x1f4e2;&#xff0c;就是 ChatGPT 的客户端终于来了&#xff01;这对我们所有 Mac 用户&#xff0c;尤…

可穿戴式手持气象仪

TH-SQ17在快节奏的现代生活中&#xff0c;我们越来越依赖各种智能设备来辅助我们的决策和行动。其中&#xff0c;气象信息的重要性不言而喻&#xff0c;它不仅关系到我们的出行安全&#xff0c;更影响着我们的日常生活安排。如今&#xff0c;一款革命性的产品——可穿戴式手持气…

GPT-4o背后的秘密:深入了解它的运作方式

GPT-4o是OpenAI最新推出的多模态大模型&#xff0c;它在语言处理、图像识别和音频处理方面都实现了重大突破。GPT-4o的"o"代表"omni"&#xff0c;意为全能&#xff0c;能够处理文本、音频、图像和视频输入&#xff0c;是一种高度集成的神经网络。这篇文章将…