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里对图形的排版,对图形进行了新的整合。