上篇文章pyecharts实现电影数据分析可视化已经实现了pyecharts可视化,这篇文章主要实现Django结合pyecharts做一个可视化的小网站/系统。
我是在Centos7虚拟机上用Sublime Text写的,你们随意即可。
创建python虚拟环境
我使用的是Python 3.6.8,只要你们不是Python2或者更老的版本,运行应该没什么问题。
进入到你存放python虚拟环境的目录,我的是/home/xwk/Desktop/python_vens
[xwk@forpython ~]$ cd Desktop/python_vens/
[xwk@forpython python_vens]$ pwd
/home/xwk/Desktop/python_vens
[xwk@forpython python_vens]$ python3 -V
Python 3.6.8
创建一个名为books
的python虚拟环境
[xwk@forpython python_vens]$ python3 -m venv books
如果发现创建错了名称怎么办,我做的电影可视化,应该创建movies
如果你已经安装了pip库,不想一个一个重新安装的话,执行
导出已安装的pip库的名称及版本
pip freeze > requirements.txt
重新创建好虚拟环境后,根据导出的库的名称及版本重新安装
pip install -r requirements.txt
删除创建错的环境,直接删除books这个虚拟环境目录即可,注意别删错了。
[xwk@forpython python_vens]$ rm -rf books/
重新创建名为movies
的虚拟环境
[xwk@forpython python_vens]$ python3 -m venv movies
进入虚拟环境
[xwk@forpython python_vens]$ cd movies/
[xwk@forpython movies]$ source ./bin/activate
(movies) [xwk@forpython movies]$
退出虚拟环境
(movies) [xwk@forpython movies]$ deactivate
[xwk@forpython movies]$
这里只是演示,如何进入和退出虚拟环境,代码的运行需要进入虚拟环境。
重新进入虚拟环境
[xwk@forpython movies]$ source ./bin/activate
(movies) [xwk@forpython movies]$
安装所需python库
pip install django
pip install pyecharts
pip install pandas
pip install pymysql
pip应该会自动安装相关依赖包,查看安装的包
(movies) [xwk@forpython movies]$ pip list
不同版本库,代码可能会有差异,比如Django,如果你不是上述版本,代码如果有报错,可以自行搜索修改,这个不难,因为肯定不会只有你一个人遇到过类似的问题。
创建Django项目
进入到你存放python虚拟环境的目录,我的是/home/xwk/Desktop/python_projects
(movies) [xwk@forpython movies]$ cd /home/xwk/Desktop/python_projects
(movies) [xwk@forpython python_projects]$
创建一个名为movies的Django项目
django-admin startproject movies
(movies) [xwk@forpython python_projects]$ cd movies/
(movies) [xwk@forpython movies]$ ls
manage.py movies
配置mysql数据库,你可以根据自己需求来
创建一个名为movies
的数据库。本文主要使用pandas,mysql只是django需要,你们也可以把csv文件导入mysql,用sql语句做查询,万变不离其宗。
mysql> create database movies;
Query OK, 1 row affected (0.00 sec)
(movies) [xwk@forpython movies]$ pwd
/home/xwk/Desktop/python_projects/movies/movies
(movies) [xwk@forpython movies]$ ls
asgi.py __init__.py __pycache__ settings.py urls.py wsgi.py
配置该目录下的settings.py
文件,更改DATABASES
内容为:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'movies',
'USER': 'root',
'PASSWORD': 'root',
'HOST': 'localhost',
'PORT': '3306',
}
}
向该目录下__init__.py
添加
import pymysql
pymysql.install_as_MySQLdb()
创建Django应用
创建一个名为movies_pyecharts
的Django应用程序
进入该目录下
(movies) [xwk@forpython movies]$ pwd
/home/xwk/Desktop/python_projects/movies
(movies) [xwk@forpython movies]$ ls
manage.py movies
(movies) [xwk@forpython movies]$ python ./manage.py startapp movies_pyecharts
(movies) [xwk@forpython movies]$ cd movies
(movies) [xwk@forpython movies]$ ls
asgi.py __init__.py __pycache__ settings.py urls.py wsgi.py
编辑settings.py
文件
向INSTALLED_APPS添加'movies_pyecharts',
(movies) [xwk@forpython movies]$ cd ../movies_pyecharts/
(movies) [xwk@forpython movies_pyecharts]$ ls
admin.py __init__.py models.py tests.py
apps.py migrations templates views.py
编辑(没有就新建)urls.py
文件
from django.urls import path
from . import views
urlpatterns = [
path('', views.index),
]
(movies) [xwk@forpython movies_pyecharts]$ cd ../movies
(movies) [xwk@forpython movies]$ ls
asgi.py __init__.py __pycache__ settings.py urls.py wsgi.py
编辑urls.py
(注意目录的切换)
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('movies_pyecharts/', include('movies_pyecharts.urls')),
]
先在 movies_pyecharts
文件夹下新建 templates
文件夹
将 pyecharts 模板,位于 pyecharts.render.templates 具体位置参考(/home/xwk/Desktop/python_vens/movies/lib/python3.6/site-packages/pyecharts/render/templates
)
拷贝至刚新建的 templates 文件夹
把获取的数据文件也复制到movies_pyecharts
文件夹下
第一个可视化页面
编辑movies_pyecharts/views.py
from jinja2 import Environment, FileSystemLoader
from pyecharts.globals import CurrentConfig
from django.http import HttpResponse
CurrentConfig.GLOBAL_ENV = Environment(loader=FileSystemLoader("./movies_pyecharts/templates"))
import pandas as pd
from pyecharts.charts import Bar,Pie,Line
import pyecharts.options as opts
data=pd.read_csv('./movies_pyecharts/电影.csv')
Year=data['上映年份'].value_counts().reset_index()
Year.rename(columns={
"index":"上映年份","上映年份":"电影数量"},inplace=True)
def index(request):
bar = (
Bar(init_opts=opts.InitOpts(height='700px', theme='light'))
.add_xaxis(
Year['上映年份'].tolist()[::-1])
.add_yaxis(
"电影数量",
Year['电影数量'].tolist()[::-1],
label_opts=opts.LabelOpts(is_show=False),
)
.set_series_opts(itemstyle_opts=opts.ItemStyleOpts(
border_color='#5C3719', ))
.set_global_opts(
title_opts=opts.TitleOpts(
title='上映年份及电影数量',
subtitle='截止2023年3月',
title_textstyle_opts=opts.TextStyleOpts(
font_family='Microsoft YaHei',
font_weight='bold',
font_size=22,
),
pos_top='1%'),
legend_opts=opts.LegendOpts(is_show=True),
xaxis_opts=opts.AxisOpts(
# name='电影数量',
is_show=True,
max_=int(Year['电影数量'].max()),
axislabel_opts=opts.LabelOpts(
font_family='Microsoft YaHei',
font_weight='bold',
font_size='14' #标签文本大小
)),
yaxis_opts=opts.AxisOpts(
# name='上映年份',
is_show=True,
axislabel_opts=opts.LabelOpts(
#interval=0,#强制显示所有y轴标签,需要可以加上
font_family='Microsoft YaHei',
font_weight='bold',
font_size='14' #标签文本大小
)),
tooltip_opts=opts.TooltipOpts(
is_show=True,
trigger='axis',
trigger_on='mousemove|clike',
axis_pointer_type='shadow',
),
toolbox_opts=opts.ToolboxOpts(is_show=True,
pos_left="right",
pos_top="center",
feature={
"saveAsImage":{
}}
)
).reversal_axis())
return HttpResponse(bar.render_embed())
现在打开http://127.0.0.1:8000/movies_pyecharts/
,就可以看到图表了!
这只是一个网页,我尝试增加网页。
增加更多可视化页面
编辑movies_pyecharts/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.index,name='index'),
path('director/',views.director,name='director'),
]
向movies_pyecharts/views.py增加如下代码:
def director(request):
Director = data['导演'].value_counts()[0:11].reset_index()
Director.rename(columns={
"index": "导演", "导演": "电影数量"}, inplace=True)
pie = (
Pie(init_opts=opts.InitOpts(theme='light'))
.add(
series_name='电影类型',
data_pair=[list(z) for z in zip(
Director['导演'].to_list(), Director['电影数量'].to_list())],
radius=["40%", "75%"],
)
# .set_colors(["blue", "green", "yellow", "red", "pink", "orange", "purple"])
.set_global_opts(
title_opts=opts.TitleOpts(
title="导演及电影数量",
subtitle='TOP10',
title_textstyle_opts=opts.TextStyleOpts(
font_family='Microsoft YaHei',
font_weight='bold',
font_size=22,
),
),
legend_opts=opts.LegendOpts(
pos_left="left",
pos_top="center",
orient='vertical',
is_show=True
),
toolbox_opts=opts.ToolboxOpts(
is_show=True,
pos_left="right",
pos_top="center",
feature={
"saveAsImage": {
}}
)
)
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
)
return HttpResponse(pie.render_embed())
打开http://127.0.0.1:8000/movies_pyecharts/director/
增加更多页面方法就是这样,我就不再增加了。
如果要更改网页标题
改类似如下代码
Bar(init_opts=opts.InitOpts(height='700px', theme='light',page_title ='上映年份及电影数量'))
更多配置参考pyecharts官网文档
Django的功能很强大,我做的这个可视化仅仅只是入门而已。