首页 > 数据库 > 数据库开发技术 > Python大屏可视化
pyecharts画图包是python里非常好用的可视化包。其也可以通过json配置画图组合,做一个可视化大屏界面。最后可以制作如下可视化图表,掌握其制作方法其他更多组合可以自行配置。
其制作步骤如下:
我这里背景统一选为PURPLE_PASSION(其接近黑色,比较适合做画布背景) 画迁徙图/运输图 我一次性导入了所有需要用到的画图子包,后面不需要再多次导入。
#迁徙图
from pyecharts.charts import Liquid,Bar, Pie, Line, HeatMap, Funnel, Gauge, Grid, Page,Geo,WordCloud # 各个图形的类
from pyecharts.globals import ChartType,SymbolType,ThemeType
from pyecharts import options as opts
city_num=[('广州',105),('北京',70),('成都',99),('西安',80),('武汉',80),('上海',80)]
start_end=[('广州','北京'),('广州','成都'),('广州','西安'),('广州','武汉'),('广州','上海')]
(
Geo(init_opts=opts.InitOpts(width='950px',height='450px',theme=ThemeType.PURPLE_PASSION)) # 图表大小,画布背景颜色
.add_schema(maptype='china',
itemstyle_opts=opts.ItemStyleOpts(color='#28527a',border_color='#9ba4b4'))#图背景颜色
.add('',data_pair=city_num,color='black')
.add('',data_pair=start_end,type_=ChartType.LINES,
effect_opts=opts.EffectOpts(symbol=SymbolType.ARROW,color='blue',symbol_size=5),
linestyle_opts=opts.LineStyleOpts(curve=0.3))
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))#不显示标签
.set_global_opts(title_opts=opts.TitleOpts(title="迁徙图",pos_left='50%')) # 图表标题
).render_notebook()
其输出图是个动态迁徙图,截图只能看静态图片如下:
同样调试好其他类别的图,都用代码实现并配置好相应的背景、参数等。我这里一共配置了柱状图、折线图、迁徙图、水球图、词云图、饼图、进度控制图七类图形。
建立画图函数,把七类图整合在一起。
from pyecharts.charts import Liquid,Bar, Pie, Line, HeatMap, Funnel, Gauge, Grid, Page,Geo,WordCloud # 各个图形的类
from pyecharts.globals import ChartType,SymbolType,ThemeType
from pyecharts import options as opts
# 1、柱状图
def barPage():
bar = (
Bar(init_opts=opts.InitOpts(theme=ThemeType.PURPLE_PASSION ,width='950px',height='450px'))
.add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
.add_yaxis("商家A", [5, 20, 36, 10, 75, 90],stack='stack1')
.add_yaxis("商家B", [1, 30, 36, 20, 65, 80],stack='stack2')
.set_global_opts(title_opts=opts.TitleOpts(title="图1", subtitle="副标题"),
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=30)))
.set_series_opts(label_opts=opts.LabelOpts(position='right'))
.reversal_axis())
return bar
#2.折线图
def linePage():
line=(
Line(init_opts=opts.InitOpts(theme=ThemeType.PURPLE_PASSION,width='950px',height='450px'))
.add_xaxis(['A','B','C','D','E'])
.add_yaxis("数据展示",[33,5,35,20,30],
markpoint_opts=opts.MarkPointOpts(
data=[opts.MarkPointItem(name="自定义标记点", coord=['B', 5], value=5)])
, is_connect_nones=True)
.set_global_opts(title_opts=opts.TitleOpts(title="图2")) )
return line
#3.迁徙图 (运输路径图)
def mapMovePage():
city_num=[('广州',10),('北京',10),('成都',10),('西安',10),('武汉',10),('上海',10)]
start_end=[('广州','北京'),('广州','成都'),('广州','西安'),('广州','武汉'),('广州','上海')]
mapMove=(
Geo(init_opts=opts.InitOpts(width='950px',height='450px',theme=ThemeType.PURPLE_PASSION)) # 图表大小,画布背景颜色
.add_schema(maptype='china',
itemstyle_opts=opts.ItemStyleOpts(color='#28527a',border_color='#9ba4b4'))#图背景颜色
.add('',data_pair=city_num,color='black')
.add('',data_pair=start_end,type_=ChartType.LINES,
effect_opts=opts.EffectOpts(symbol=SymbolType.ARROW,color='blue',symbol_size=8),
linestyle_opts=opts.LineStyleOpts(curve=0.2))
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))#不显示标签
.set_global_opts(title_opts=opts.TitleOpts(title="图3",pos_left='50%'))) # 图表标题
return mapMove
#4.进度图(水球图)
def liquidPage():
c = (
Liquid(init_opts=opts.InitOpts(width='950px',height='450px',theme=ThemeType.PURPLE_PASSION))
.add("lq", [0.3, 0.2, 0.4], is_outline_show=False)
.set_global_opts(title_opts=opts.TitleOpts(title="图4")))
return c
#5.饼图
def piePage():
inner_x_data = ["直达", "营销广告", "搜索引擎"]
inner_y_data = [335, 679, 1548]
inner_data_pair = [list(z) for z in zip(inner_x_data, inner_y_data)]
outer_x_data = ["直达", "营销广告", "搜索引擎", "邮件营销", "联盟广告", "视频广告", "百度", "谷歌", "必应", "其他"]
outer_y_data = [335, 310, 234, 135, 1048, 251, 147, 102]
outer_data_pair = [list(z) for z in zip(outer_x_data, outer_y_data)]
kk=(
Pie(init_opts=opts.InitOpts(width='950px',height='450px',theme=ThemeType.PURPLE_PASSION))
.add(
series_name="访问来源",
data_pair=inner_data_pair,
radius=[0, "30%"],
label_opts=opts.LabelOpts(position="inner"),)
.add(
series_name="访问来源",
radius=["40%", "55%"],
data_pair=outer_data_pair,
label_opts=opts.LabelOpts(
position="outside",
formatter="{a|{a}}{abg|}\n{hr|}\n {b|{b}: }{c} {per|{d}%} ",
background_color="#eee",
border_color="#aaa",
border_width=1,
border_radius=4,
rich={
"a": {"color": "#999", "lineHeight": 22, "align": "center"},
"abg": {
"backgroundColor": "#e3e3e3",
"width": "100%",
"align": "right",
"height": 22,
"borderRadius": [4, 4, 0, 0],
},
"hr": {
"borderColor": "#aaa",
"width": "100%",
"borderWidth": 0.5,
"height": 0,
},
"b": {"fontSize": 16, "lineHeight": 33},
"per": {
"color": "#eee",
"backgroundColor": "#334455",
"padding": [2, 4],
"borderRadius": 2,
},
},
),)
.set_global_opts(legend_opts=opts.LegendOpts(pos_left="left", orient="vertical"))
.set_series_opts(
tooltip_opts=opts.TooltipOpts(
trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)"
)
))
return kk
#6.进度控制图
def gaugePage():
cnew = (
Gauge(init_opts=opts.InitOpts(width='950px',height='450px',theme=ThemeType.PURPLE_PASSION))
.add(
"业务指标",
[("指针", 77)],
split_number=5,
axisline_opts=opts.AxisLineOpts(
linestyle_opts=opts.LineStyleOpts(
color=[(0.3, "#67e0e3"), (0.7, "#37a2da"), (1, "#fd666d")], width=30
)
),
detail_label_opts=opts.LabelOpts(formatter="{value}"),
)
.set_global_opts(
title_opts=opts.TitleOpts(title="图6"),
legend_opts=opts.LegendOpts(is_show=False),))
return cnew
#7.词云图
def wmapPage():
data = [
("出租车运营管理", "385"),
("供热管理", "375"),
("市容环卫", "355"),
("自然资源管理", "355"),
("粉尘污染", "335"),
("医疗卫生", "284"),
("粉煤灰污染", "284"),
("占道", "284"),
("供热发展", "254"),
("农村土地规划管理", "254"),
("生活噪音", "253"),
("供热单位影响", "253"),
("城市供电", "223"),
("房屋质量与安全", "223"),
("大气污染", "223"),
("房屋安全", "223"),
("文化活动", "223"),
("拆迁管理", "223"),
("公共设施", "223"),
("供气质量", "223"),
("供电管理", "223"),
("燃气管理", "152"),
("教育管理", "152"),
("医疗纠纷", "152"),
("执法监督", "152"),
("设备安全", "152"),
("政务建设", "152"),
("县区、开发区", "152"),
("宏观经济", "152"),
("教育管理", "112"),
("社会保障", "112"),
("生活用水管理", "112"),
("物业服务与管理", "112"),
("分类列表", "112"),
("农业生产", "112"),
("二次供水问题", "112"),
("城市公共设施", "92"),
("拆迁政策咨询", "92"),
("物业服务", "92"),
("物业管理", "92"),
("社会保障保险管理", "92"),
("低保管理", "92"),
("文娱市场管理", "72"),
("城市交通秩序管理", "72"),
("执法争议", "72"),
("压力容器安全", "71"),
("身份证管理", "71"),
("群众健身", "41"),
("工业排放污染", "41"),
("破坏森林资源", "41"),
("市场收费", "41"),
("生产资金", "41"),
("职业教育", "21"),
("物业资质管理", "21"),
("拆迁补偿", "21"),
("设施维护", "21"),
("市场外溢", "11"),
("占道经营", "11"),
("树木管理", "11"),
("农村基础设施", "11"),
("无水", "11"),
("供气质量", "11"),
]
wmap=(
WordCloud(init_opts=opts.InitOpts(width='950px',height='450px',theme=ThemeType.PURPLE_PASSION))
.add(series_name="热点分析", data_pair=data, word_size_range=[6, 66])
.set_global_opts(
title_opts=opts.TitleOpts(
title="图7", title_textstyle_opts=opts.TextStyleOpts(font_size=23)
),
tooltip_opts=opts.TooltipOpts(is_show=True),
))
return wmap
把这些图整合在一起。
page = (
Page(layout=Page.DraggablePageLayout)
.add(
barPage(),
linePage(),
mapMovePage(),
liquidPage(),
piePage(),
gaugePage(),
wmapPage()))
page.render("page_demo.html")
现在输出的page_demo.html是一个按由上到下排列的图,显然不是我们要的最终结果。
对上一步骤生成的page_demo.html图,进行排版, 排完以后点save config键,会生成一个json文件,把该文件复复制到代码的路径。运行以下代码:
Page.save_resize_html("page_demo.html", # 上面的HTML文件名称
cfg_file="chart_config.json", # 保存的json配置文件
dest="new_page_demo.html") # 新HTML文件名称
new_page_demo.html即为新生成的大屏可视化图表。
pyechart制作的大屏可视化的原理是通过生成json文件,按照json里对图形的排版,对图形进行了新的整合。
原文作者:Python学习杂记;如有侵权,请联系管理员删除。