Pyecharts绘制精美图标并做成可视化大屏 Python

Pyecharts,数据可视化神器。说到它就不得不提Echarts,它是由百度开源的一款使用JavaScript实现的开源可视化库,涵盖了各种图表、满足各类业务需求,而pyecharts也就是Python与Echarts结合之后的产物,封装了Echarts各类图表的基本操作,然后通过渲染机制,
输出一个包含JS代码的HTML文件。
使用Pyecharts创建图形的基本步骤是:
1. 准备数据
2. 设计图形的样式、背景颜色
3. Pyecharts绘图
4. 设计图表的标题或者图例等属性
5. 导出至html
Pyecharts画图的基本实例:
  1 from pyecharts.charts import Bar,Boxplot
  2 from pyecharts.faker import Faker
  3 import pyecharts.options as opts
  4 from pyecharts.globals import ThemeType
  5 
  6 # 1,堆叠柱状图(全部堆叠)
  7 def barGrid():
  8     c = (
  9         Bar()
 10         .add_xaxis(Faker.choose())
 11         .add_yaxis("商家1", Faker.values(), stack="stack1")
 12         .add_yaxis("商家2", Faker.values(), stack="stack1")
 13         .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
 14         .set_global_opts(title_opts=opts.TitleOpts(title="Bar-堆叠数据(全部)"))
 15         .render("bar_stack_1212.html")
 16     )
 17 
 18 # 2,部分堆叠柱状图(部分堆叠)
 19 def barGrid_2():
 20     """
 21     部分堆叠柱状图
 22     """
 23     c = (
 24         Bar(init_opts=opts.InitOpts(width='1080px', height='960px', theme=ThemeType.LIGHT))
 25         .add_xaxis(Faker.choose())
 26         .add_yaxis('商家A', Faker.values(), stack='stack0', bar_max_width='100px')
 27         .add_yaxis('商家B', Faker.values(), stack='stack0')
 28         .add_yaxis('商家C', Faker.values()) # 不堆叠
 29         .set_global_opts(title_opts=opts.TitleOpts(title='柱状图堆叠(部分)'))
 30         .set_series_opts(label_opts=opts.LabelOpts(is_show=True))
 31     ).render('bar_stack_party.html')
 32 
 33 # 3,柱状图的横坐标倾斜角度
 34 def bar_rotation():
 35     c = (
 36         Bar()
 37         .add_xaxis(
 38             ['名字很长的x轴标签1',
 39              '名字很长的x轴标签2',
 40              '名字很长的x轴标签3',
 41              '名字很长的x轴标签4',
 42              '名字很长的x轴标签5',
 43              '名字很长的x轴标签6',
 44              '名字很长的x轴标签7']
 45         )
 46         .add_yaxis('商家1', Faker.values()) #  第一组y数据
 47         .add_yaxis('商家2', Faker.values()) #  第二组y数据
 48         .set_global_opts(
 49             xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=15)), # 让x轴倾斜45度
 50             title_opts=opts.TitleOpts(title='柱状图x轴标签倾斜示意图',subtitle='x轴标签太长了')
 51         )
 52     ).render('bar_rotation_45.html')
 53 
 54 # 4,柱状图水平有拖块儿
 55 def bar_auto_zoom_horizontal():
 56     c = (
 57         Bar(init_opts=opts.InitOpts(width='1080px', height='960px', theme=ThemeType.LIGHT))
 58         .add_xaxis(Faker.days_attrs)
 59         .add_yaxis('实例1', Faker.days_values)
 60         .set_global_opts(
 61             title_opts=opts.TitleOpts(title='Bar-柱状图缩放(拖块-水平)'),
 62             datazoom_opts=opts.DataZoomOpts(), # 水平方向设置托块
 63         )
 64     ).render('bar_datazoom_horizontal_example.html')
 65 
 66 # 5,柱状图垂直方向拖块
 67 def bar_auto_zoom_vertical():
 68     c = (
 69         Bar(init_opts=opts.InitOpts(width='1080px', height='960px', theme=ThemeType.LIGHT))
 70         .add_xaxis(Faker.days_attrs)
 71         .add_yaxis('实例1', Faker.days_values)
 72         .set_global_opts(
 73             title_opts=opts.TitleOpts(title='Bar-柱状图缩放(拖块-垂直)'),
 74             datazoom_opts=opts.DataZoomOpts(orient='vertical') # 垂直方向设置拖块
 75         )
 76     ).render('bar_datazoom_vertical_example.html')
 77 
 78 # 6,柱状图拖块内置和外置
 79 def bar_auto_zoom():
 80     """
 81     通过缩放拖块来实现数据缩放
 82     """
 83     c = (
 84         Bar(init_opts=opts.InitOpts(width='1080px',height='960px', theme=ThemeType.LIGHT))
 85         .add_xaxis(Faker.days_attrs)
 86         .add_yaxis('实例1', Faker.days_values)
 87         .set_global_opts(
 88             title_opts=opts.TitleOpts(title='Bar-柱状图缩放(内置-外置)'),
 89             datazoom_opts=[opts.DataZoomOpts(), opts.DataZoomOpts(type_='inside')], #  内置拖块
 90         )
 91     ).render('bar_zoom_last.html')
 92 
 93 # 7,柱状图x轴和y轴的命名
 94 def bar_x_y_name():
 95     c = (
 96         Bar(init_opts=opts.InitOpts(width='1080px',height='960px', theme=ThemeType.DARK))
 97         .add_xaxis(Faker.choose())
 98         .add_yaxis('实例1', Faker.values())
 99         .add_yaxis('实例2', Faker.values())
100         .set_global_opts(
101             title_opts=opts.TitleOpts('柱状图给x,y轴命名'),
102             yaxis_opts=opts.AxisOpts(name='Y轴名称'),
103             xaxis_opts=opts.AxisOpts(name='X轴名称'),
104         )
105     ).render('bar_name_x_y.html')
106 
107 # 8,柱状图不同柱子之间的距离也可以不相同
108 def bar_bar_distance():
109     c = (
110         Bar(init_opts=opts.InitOpts(width='1080px', height='960px', theme=ThemeType.ROMANTIC))
111         .add_xaxis(Faker.choose())
112         .add_yaxis('实例1', Faker.values(), gap='0%')
113         .add_yaxis('实例2', Faker.values(), gap='5%')
114         .set_global_opts(title_opts=opts.TitleOpts(title='柱状图间距不同'))
115     ).render('bar_bar_distance.html')
116 
117 # 9,柱状图是水平方向的
118 def bar_horizontal_y_axis():
119     c = (
120         Bar(init_opts=opts.InitOpts(width='1080px', height='960px', theme=ThemeType.ROMA))
121         .add_xaxis(Faker.choose())
122         .add_yaxis('实例1',Faker.values())
123         .add_yaxis('实例2', Faker.values())
124         .set_global_opts(title_opts=opts.TitleOpts(title='柱状图x,y轴翻转'))
125         .reversal_axis() #  翻转x,y轴
126     ).render('x_y_reversal.html')
127 
128 # 9,直方图
129 def horitogram():
130     c = (
131         Bar(init_opts=opts.InitOpts(width='1280px', height='960px', theme=ThemeType.WONDERLAND))
132         .add_xaxis(Faker.choose())
133         .add_yaxis('实例1', Faker.values(), category_gap=0, color=Faker.rand_color())
134         .set_global_opts(title_opts=opts.TitleOpts('直方图-Bar'))
135     ).render('bar_horitogram.html')
136 
137 # 10,箱型图
138 def box_chart_pyec():
139     v1 = [
140         [850, 740, 950, 1090, 930, 850, 950, 980, 1000, 880, 1000, 980],
141         [980, 940, 960, 940, 900, 800, 850, 880, 950, 840, 830, 800],
142     ]
143     v2 = [
144         [890, 820, 820, 820, 800, 770, 760, 760, 750, 760, 950, 920],
145         [900, 840, 800, 810, 760, 810, 790, 850, 820, 850, 870, 880],
146     ]
147     c = (
148         Boxplot(init_opts=opts.InitOpts(width='1280px', height='960px', theme=ThemeType.LIGHT))
149         .add_xaxis(["实例1", "实例2"])
150         .add_yaxis('类目1', Boxplot.prepare_data(v1))
151         .add_yaxis('类目2', Boxplot.prepare_data(v2))
152         .set_global_opts(title_opts=opts.TitleOpts(title='箱型图-基本实例'))
153     ).render('box_plot_py.html')
154 
155 # 11,日历图
156 from pyecharts.charts import Calendar
157 def calendar_chart():
158     """
159     日历图具体指按照日历的布局,用颜色展现每一天的数据,从而比较直观地看到全年的数据情况,
160     例如展示超市全年的销售额,从而看出具体某个月份或者某个星期的销售额比较低
161     """
162     c = (
163         Calendar(init_opts=opts.InitOpts(width='1280px', height='960px', theme=ThemeType.HALLOWEEN))
164         .add('', data, calendar_opts=opts.CalendarOpts(range_="2020"))
165         .set_global_opts(
166             title_opts=opts.TitleOpts(title='日历图-2020年销售额'),
167             visualmap_opts=opts.VisualMapOpts(
168                 max_=250000,
169                 min_=10000,
170                 orient='horizontal',
171                 is_piecewise=True,
172                 pos_left='100px',
173                 pos_top='230px',
174             ),
175         )
176     ).render('calendar_chart.html')
177 
178 # 12,K线图
179 from pyecharts.charts import Kline
180 def k_chart():
181     k = (
182         Kline(init_opts=opts.InitOpts(width='1280px', height='960px', theme=ThemeType.VINTAGE))
183         .add_xaxis(["2020/7/{}".format(i + 1) for i in range(31)])
184         .add_yaxis('kLine', data)
185         .set_global_opts(
186             yaxis_opts=opts.AxisOpts(is_scale=True),
187             xaxis_opts=opts.AxisOpts(is_scale=True),
188             title_opts=opts.TitleOpts(title='K线图基本实例'),
189         )
190     ).render('kline_test.html')
191 
192 # 13,漏斗图
193 from pyecharts.charts import Funnel
194 def funnel_chart():
195     f = (
196         Funnel(init_opts=opts.InitOpts(width='1280px', height='960px', theme=ThemeType.LIGHT))
197         .add('类目', [list(z) for z in zip(Faker.choose(), Faker.values())])
198         .set_global_opts(title_opts=opts.TitleOpts(title='漏斗图基本实例'))
199     ).render('funnel_test.html')
200 
201 
202 # 14,折线图
203 from pyecharts.charts import Line
204 def line_chart():
205     l = (
206         Line()
207         .add_xaxis(Faker.choose())
208         .add_yaxis('商家1', Faker.values())
209         .add_yaxis('商家2', Faker.values())
210         .set_global_opts(title_opts=opts.TitleOpts(title='折线图基本实例'))
211     ).render('line_test.html')
212 
213 # 15,水球图
214 from pyecharts.charts import Liquid
215 def liquid_chart():
216     """水球图通常用于完成指标完成程度"""
217     l = (
218         Liquid()
219         .add('lq', [0.55, 0.75])
220         .set_global_opts(title_opts=opts.TitleOpts(title='水球图基本实例'))
221     ).render('liquid_test.html')
222 
223 # 16,词云图
224 from pyecharts.charts import WordCloud
225 def wordcloud_chart():
226     w = (
227         WordCloud()
228         .add(series_name='词云示例图', data_pair=data, word_size_range=[5,100])
229         .set_global_opts(
230             title_opts=opts.TitleOpts(
231                 title='词云示例图',
232                 title_textstyle_opts=opts.TextStyleOpts(font_size=23)),
233             tooltip_opts=opts.TooltipOpts(is_show=True)
234         )
235     ).render('basci_wordcloud.html')
236 
237 # 17,饼图
238 from pyecharts.charts import Pie
239 def pie_chart():
240     p = (
241         Pie()
242         .add('类目', data_pair=[list(z) for z in zip(Faker.choose(), Faker.values())])
243         .set_global_opts(title_opts=opts.TitleOpts(title='饼图基本实例'),)
244         .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{c}"))
245     ).render('pie_test.html')
246 
247 # 18,仪表盘图
248 from pyecharts.charts import Gauge
249 def gauge_chart():
250     g = (
251         Gauge(init_opts=opts.InitOpts())
252         .add(" ",[('完成率', 70)]) # 元组数据类型
253         .set_global_opts(title_opts=opts.TitleOpts(title='仪表盘图基本实例'))
254     ).render('gauge_test.html')
255 
256 # 19,地图
257 from pyecharts.charts import Map
258 def map_chart():
259     m = (
260         Map(init_opts=opts.InitOpts())
261         .add('实例1', [list(z) for z in zip(Faker.provinces, Faker.values())])
262         .set_global_opts(title_opts=opts.TitleOpts(title='地图基本实例'))
263     ).render('map_test.html')
264 
265 
266 # 20,涟漪散点图
267 from pyecharts.charts import EffectScatter
268 def effectscatter_chart():
269     e = (
270         EffectScatter(init_opts=opts.InitOpts(theme=ThemeType.VINTAGE))
271         .add_xaxis(Faker.choose())
272         .add_yaxis('商家1', Faker.values())
273         .set_global_opts(title_opts=opts.TitleOpts(title='涟漪散点图基本实例'))
274     ).render('effectscatter_test.html')

Pyecharts组合图表

将绘制出来的若干份图表组合到一块儿,总共有这几种方式

  • Grid: 并行/垂直放置多张图
  • Page: 顺序多图
  • Tab: 多个页面多图
  • Timeline: 时间轴循环轮播多图

羡慕别人的可视化大屏,把所有图表放在同一界面里,自己也来尝试下,使用page来顺序展示多张图表,挑上面代码的几个函数来试试,要把代码稍微改下,就是把render全部改成return:

 1 from pyecharts.charts import Pie
 2 def pie_chart():
 3     p = (
 4         Pie()
 5         .add('类目', data_pair=[list(z) for z in zip(Faker.choose(), Faker.values())])
 6         .set_global_opts(title_opts=opts.TitleOpts(title='饼图基本实例'),)
 7         .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{c}"))
 8     )
 9     return p
10 # 18,仪表盘图
11 from pyecharts.charts import Gauge
12 def gauge_chart():
13     g = (
14         Gauge(init_opts=opts.InitOpts())
15         .add(" ",[('完成率', 70)]) # 元组数据类型
16         .set_global_opts(title_opts=opts.TitleOpts(title='仪表盘图基本实例'))
17     )
18     return g
19 # 19,地图
20 from pyecharts.charts import Map
21 def map_chart():
22     m = (
23         Map(init_opts=opts.InitOpts())
24         .add('实例1', [list(z) for z in zip(Faker.provinces, Faker.values())])
25         .set_global_opts(title_opts=opts.TitleOpts(title='地图基本实例'))
26     )
27     return m
28 
29 # 20,涟漪散点图
30 from pyecharts.charts import EffectScatter
31 def effectscatter_chart():
32     e = (
33         EffectScatter(init_opts=opts.InitOpts(theme=ThemeType.VINTAGE))
34         .add_xaxis(Faker.choose())
35         .add_yaxis('商家1', Faker.values())
36         .set_global_opts(title_opts=opts.TitleOpts(title='涟漪散点图基本实例'))
37     )
38     return e
39 
40 from pyecharts.charts import Page
41 
42 page = Page(layout=Page.DraggablePageLayout, page_title='基于Pyecharts的可视化大屏') # 之所以用DraggablePageLayout属性是为了调整成我们所想要的布局,然后将我们所绘制的图表一一添加
43 page.add(
44     pie_chart(),
45     gauge_chart(),
46     map_chart(),
47     effectscatter_chart(),
48 ).render('可视化大屏设置.html') # 运行完成后手动调整布局

对图片布局完成之后,要记得点击左上角的save config按钮对布局文件进行保存。之后本地会生成一个chart_config.json文件,然后运行下面的代码:

page.save_resize_html('可视化大屏设置.html', cfg_file='chart_config.json', dest='可视化大屏.html')

运行后就是需要的可视化大屏页面了。效果大致如下:

 

原文地址:https://www.cnblogs.com/mafu/p/15624537.html