欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > python >内容正文

python

python 图表 web_Web | Django 与 Chart.js 联用做出精美的图表

发布时间:2024/8/5 python 44 豆豆
生活随笔 收集整理的这篇文章主要介绍了 python 图表 web_Web | Django 与 Chart.js 联用做出精美的图表 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

class Country(models.Model):name = models.CharField(max_length=30)class City(models.Model):name = models.CharField(max_length=30)country=models.ForeignKey(Country, on_delete=models.CASCADE)population = models.PositiveIntegerField()

并将原始数据存储在数据库中:城市

ID

名称

country_id

人口

1

东京

28

36,923,000

2

上海

13

34,000,000

3

雅加达

19

30,000,000

4

汉城

21

25,514,000

5

广州

13

25,000,000

6

北京

13

24,900,000

7

卡拉奇

22

24,300,000

8

深圳

13

23,300,000

9

新德里

25

21,753,486

10

墨西哥城

24

21,339,781

11

拉各斯

9

21,000,000

12

圣保罗

1

20,935,204

13

孟买

25

20,748,395

14

纽约市

20

20,092,883

15

大阪

28

19,342,000

16

武汉市

13

19,000,000

17

成都市

13

18,100,000

18

达卡

4

17,151,925

19

重庆市

13

17,000,000

20

天津

13

15,400,000

21

加尔各答

25

14,617,882

国家

ID

名称

1

巴西

2

土耳其

3

意大利

4

孟加拉国

5

加拿大

6

法国

7

秘鲁

8

阿根廷

9

奈及利亚

10

澳大利亚

11

伊朗

12

新加坡

13

中国

14

智利

15

泰国

16

德国

17

西班牙

18

菲律宾

19

印度尼西亚

20

美国

21

南韩

22

巴基斯坦

23

安哥拉

24

墨西哥

25

印度

26

英国

27

哥伦比亚

28

日本

29

台湾

示例1:饼图

对于第一个示例,我们仅要检索人口最多的前5个城市,并将其以饼图形式呈现。在这种策略中,

我们将返回图表数据作为视图上下文的一部分,并使用Django模板语言将结果注入JavaScript

代码中。

views.py

from django.shortcuts import renderfrom mysite.core.models import Citydef pie_chart(request):labels = []data = []queryset = City.objects.order_by('-population')[:5]for city in queryset:labels.append(city.name)data.append(city.population)return render(request, 'pie_chart.html', {'labels': labels,'data': data,})

基本上在上面的视图中,我们遍历Cityqueryset并构建的列表labels和data。在这种情况下,这里data是City模型中保存的人口计数。

对于urls.py一个简单的路由:

urls.py

from django.urls import pathfrom mysite.core import viewsurlpatterns = [path('pie-chart/', views.pie_chart, name='pie-chart'),]

现在是模板。我从Chart.js饼图文档中获得了一个基本片段。

pie_chart.html

{% extends 'base.html' %}{% block content %}

{% endblock %}

在上面的示例中,base.html模板并不重要,但是您可以在本文结尾处共享的代码示例中看到它。这种策略不是理想的,但是效果很好。不好的是,我们正在使用Django模板语言来干扰JavaScript逻辑。当我们放置时,我们直接在JavaScript代码中注入来自服务器的变量,如{{ data|safe}}

上面的代码展示效果如下所示:

示例2:使用Ajax的条形图

如标题所示,我们现在将使用异步调用来绘制条形图。

views.py

from django.shortcuts import renderfrom django.db.models import Sumfrom django.http import JsonResponsefrom mysite.core.models import Citydef home(request):return render(request, 'home.html')def population_chart(request):labels = []data = []queryset = City.objects.values('country__name').annotate(country_population=Sum('population')).order_by('-country_population')for entry in queryset:labels.append(entry['country__name'])data.append(entry['country_population'])return JsonResponse(data={'labels': labels,'data': data,})

因此,这里我们使用两个视图函数。该home视图将是加载图表的主页。另一个视图population_chart将是唯一负责提供数据的视图,返回带有标签和数据的JSON格式响应数据。如果您想知道此查询集在做什么,它将按国家对城市进行分组,并汇总每个国家的总人口。结果将是国家/地区总人口列表。要了解有关这种查询的更多信息,请查看:Django基础(24): aggregate和annotate方法使用详解与示例

urls.py

from django.urls import pathfrom mysite.core import viewsurlpatterns = [path('', views.home, name='home'),path('population-chart/', views.population_chart, name='population-chart'),]

home.html

{% extends 'base.html' %}{% block content %}

{% endblock %}

现在我们前端和后端有了更好的分离,可以先查看下图表容器:

我们添加了获取数据的data-url。稍后,我们将使用它来执行Ajax调用。

var $populationChart = $("#population-chart");$.ajax({url: $populationChart.data("url"),success: function (data) {// 生成bar图标实例,展示data。}});

success以后,在回调内部,我们最终使用JsonResponse数据执行与Chart.js相关的代码, 展示效果如下图所示:

小结

我希望本教程可以帮助您开始使用Chart.js处理图表。不久前,我使用Highcharts库发布了

关于同一主题的另一篇教程。方法大致相同:如何将Highcharts.js与Django集成。

如果您想获取本教程中使用的代码,可以在这里找到:

github.com/sibtc/django-chartjs-example。

大江狗翻译整理,原作Vitor Freitas

总结

以上是生活随笔为你收集整理的python 图表 web_Web | Django 与 Chart.js 联用做出精美的图表的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。