Python可视化初探

此生若能得幸福安稳,谁又愿颠沛流离。

首先安装

pip install pyecharts

柱状图

# coding:utf-8
from pyecharts import Bar
bar = Bar('WWW.langzi.fun文章数量统计','这个只是二级标题')
# 实例化对象,并且创建标题和副标题
bar.use_theme('light')
# 使用主题
bar.add('文章数量',['2018-1','2018-2','2018-3','2018-4','2018-5'],[3,25,13,5,18],is_more_utils=True)
# 添加数据,数据一般为两个列表(长度一致)。如果你的数据是字典或者是带元组的字典。可利用cast()方法转换,is_more_utils可以选择数据的显示方式
bar.render('render.html')
# 生成本地html文件

主题除了light还有很多,安装方式如下

pip install echarts-themes-pypkg

主题大概有这么多

vintage
macarons
infographic
shine
roma
westeros
wonderland
chalk
halloween
essos
walden
purple-passion
romantic

堆叠柱状图

# coding:utf-8
from pyecharts import Bar
bar = Bar('WWW.langzi.fun文章数量统计','这个只是二级标题')
bar.use_theme('light')
utctime = ['2018-1','2018-2','2018-3','2018-4','2018-5']
count_1 = [1,5,3,4,6]
count_2 = [10,55,53,24,16]
bar.add('文章数量',utctime,count_1,is_stack=True)
bar.add('评论数量',utctime,count_2,is_stack=True)
bar.render('2.html')

带特效的散点图

# coding:utf-8
from pyecharts import EffectScatter
es = EffectScatter('动态的666')
count_1 = [1,5,3,4,6]
count_2 = [10,55,53,24,16]
es.add('EffectScatter',count_1,count_2)
es.render('3.html')

# coding:utf-8
from pyecharts import  EffectScatter
es = EffectScatter('动态散点图')
es.add("", [10], [10], symbol_size=20, effect_scale=3.5, effect_period=3, symbol="pin")
es.add("", [20], [20], symbol_size=12, effect_scale=4.5, effect_period=4,symbol="rect")
es.add("", [30], [30], symbol_size=30, effect_scale=5.5, effect_period=5,symbol="roundRect")
es.add("", [40], [40], symbol_size=10, effect_scale=6.5, effect_brushtype='fill',symbol="diamond")
es.add("", [50], [50], symbol_size=16, effect_scale=5.5, effect_period=3,symbol="arrow")
es.add("", [60], [60], symbol_size=6, effect_scale=2.5, effect_period=3,symbol="triangle")
es.render()

其中动态图属性如下:

symbol_size   图形大小
effect_scale  图形缩放
effect_period 图形速度
symbol        图形类型

漏斗图

# coding:utf-8
from pyecharts import Funnel
fu = Funnel('目标重要度')
target = ['发财','暴富','变有钱','捡到钱','捡到很多钱']
importent = [100,120,110,20,10]
fu.add('小目标',target,importent,is_label_show=True,label_pos="inside", label_text_color="#fff")
#is_label_show 是否移动鼠标显示名称
#label_text_color 名称颜色
#label_pos 是否展示名称
fu.render('5.html')

仪表盘

# coding:utf-8
from pyecharts import Gauge
ga = Gauge('今日捡到钱概率')
ga.add('浪师傅神机妙算1.0','概率',15.66)
ga.render('6.html')

水球图

# coding:utf-8
from pyecharts import Liquid
lli = Liquid('今日踩到屎概率')
lli.add('浪师傅神机妙算2.0',[0.11])
lli.render('8.html')

折线图

# coding:utf-8
from pyecharts import Line
li = Line('2018年文章数量')
utctime = ['2018-1','2018-2','2018-3','2018-4','2018-5']
count_1 = [1,5,3,4,6]
count_2 = [10,55,53,24,16]
li.add('文章数量',utctime,count_1,mark_point=['average'])
li.add('文章评论',utctime,count_2,is_smooth=True,mark_line=['max','average'],is_more_utils=True)
#is_label_show 展示数据量
#is_step阶梯展示
li.render('7.html')

如果想让折线图面积显示出的话

li.add('文章数量',utctime,count_1,is_fill=True,line_opacity=0.2,area_opacity=0.4,symbol=None)
li.add('文章评论',utctime,count_2,is_fill=True, area_color='#000', area_opacity=0.3, is_smooth=True)

不同显示效果自己写着试一试看吧

饼状图

# coding:utf-8
from pyecharts import Pie
utctime = ['2018-1','2018-2','2018-3','2018-4','2018-5']
count_1 = [1,5,3,4,6]
pie = Pie('不多BB')
pie.add('langzi.fun',utctime,count_1,is_label_show=True)
pie.render('9.html')

地理坐标图

可以通过pip安装一些地图扩展:

$ pip install echarts-countries-pypkg(国家)
$ pip install echarts-china-provinces-pypkg(中国省份及区域)
$ pip install echarts-china-cities-pypkg(中国城市)
$ pip install echarts-china-counties-pypkg(中国县区)
$ pip install echarts-china-misc-pypkg(中国民俗区)
$ pip install echarts-united-kingdom-pypkg(英国地图)

因为图例类型有’scatter’, ‘effectScatter’, ‘heatmap’可选,所以我们分别画一下。

如果直接写入是会报错的,需要在开头加上这么一行

from __future__ import unicode_literals

代码如下:

# coding:utf-8
from __future__ import unicode_literals
from pyecharts import Geo
data = [
("海门", 9),("鄂尔多斯", 12),("招远", 12),("舟山", 12),("齐齐哈尔", 14),("盐城", 15),
("赤峰", 16),("青岛", 18),("乳山", 18),("金昌", 19),("泉州", 21),("莱西", 21),
("日照", 21),("胶南", 22),("南通", 23),("拉萨", 24),("云浮", 24),("梅州", 25),
("文登", 25),("上海", 25),("攀枝花", 25),("威海", 25),("承德", 25),("厦门", 26),
("汕尾", 26),("潮州", 26),("丹东", 27),("太仓", 27),("曲靖", 27),("烟台", 28),
("福州", 29),("瓦房店", 30),("即墨", 30),("抚顺", 31),("玉溪", 31),("张家口", 31),
("阳泉", 31),("莱州", 32),("湖州", 32),("汕头", 32),("昆山", 33),("宁波", 33),
("湛江", 33),("揭阳", 34),("荣成", 34),("连云港", 35),("葫芦岛", 35),("常熟", 36),
("东莞", 36),("河源", 36),("淮安", 36),("泰州", 36),("南宁", 37),("营口", 37),
("惠州", 37),("江阴", 37),("蓬莱", 37),("韶关", 38),("嘉峪关", 38),("广州", 38),
("延安", 38),("太原", 39),("清远", 39),("中山", 39),("昆明", 39),("寿光", 40),
("盘锦", 40),("长治", 41),("深圳", 41),("珠海", 42),("宿迁", 43),("咸阳", 43),
("铜川", 44),("平度", 44),("佛山", 44),("海口", 44),("江门", 45),("章丘", 45),
("肇庆", 46),("大连", 47),("临汾", 47),("吴江", 47),("石嘴山", 49),("沈阳", 50),
("苏州", 50),("茂名", 50),("嘉兴", 51),("长春", 51),("胶州", 52),("银川", 52),
("张家港", 52),("三门峡", 53),("锦州", 54),("南昌", 54),("柳州", 54),("三亚", 54),
("自贡", 56),("吉林", 56),("阳江", 57),("泸州", 57),("西宁", 57),("宜宾", 58),
("呼和浩特", 58),("成都", 58),("大同", 58),("镇江", 59),("桂林", 59),("张家界", 59),
("宜兴", 59),("北海", 60),("西安", 61),("金坛", 62),("东营", 62),("牡丹江", 63),
("遵义", 63),("绍兴", 63),("扬州", 64),("常州", 64),("潍坊", 65),("重庆", 66),
("台州", 67),("南京", 67),("滨州", 70),("贵阳", 71),("无锡", 71),("本溪", 71),
("克拉玛依", 72),("渭南", 72),("马鞍山", 72),("宝鸡", 72),("焦作", 75),("句容", 75),
("北京", 79),("徐州", 79),("衡水", 80),("包头", 80),("绵阳", 80),("乌鲁木齐", 84),
("枣庄", 84),("杭州", 84),("淄博", 85),("鞍山", 86),("溧阳", 86),("库尔勒", 86),
("安阳", 90),("开封", 90),("济南", 92),("德阳", 93),("温州", 95),("九江", 96),
("邯郸", 98),("临安", 99),("兰州", 99),("沧州", 100),("临沂", 103),("南充", 104),
("天津", 105),("富阳", 106),("泰安", 112),("诸暨", 112),("郑州", 113),("哈尔滨", 114),
("聊城", 116),("芜湖", 117),("唐山", 119),("平顶山", 119),("邢台", 119),("德州", 120),
("济宁", 120),("荆州", 127),("宜昌", 130),("义乌", 132),("丽水", 133),("洛阳", 134),
("秦皇岛", 136),("株洲", 143),("石家庄", 147),("莱芜", 148),("常德", 152),("保定", 153),
("湘潭", 154),("金华", 157),("岳阳", 169),("长沙", 175),("衢州", 177),("廊坊", 193),
("菏泽", 194),("合肥", 229),("武汉", 273),("大庆", 279)]

geo = Geo("全国主要城市空气质量", "data from pm2.5", title_color="#fff",title_pos="center", width=1200,height=600, background_color='#404a59')
attr, value = geo.cast(data)
geo.add("", attr, value, type="effectScatter", is_random=True, effect_scale=5)
# geo.add("", attr, value, visual_range=[0, 200], visual_text_color="#fff",symbol_size=15, is_visualmap=True)
# 使用默认的scatter类型
# geo.add("", attr, value, type="heatmap", is_visualmap=True, visual_range=[0, 300],visual_text_color='#fff')
# 使用headmap'类型
geo.render('10.html')

再画一个地理坐标系线图,非常适合用以分析出行数据。

# coding:utf-8
from __future__ import unicode_literals
from pyecharts import GeoLines, Style
style = Style(title_top="#fff",title_pos = "center",width=1200,height=600,background_color="#404a59")
style_geo = style.add(is_label_show=True,line_curve=0.2,line_opacity=0.6,legend_text_color="#eee",
legend_pos="right",geo_effect_symbol="plane",geo_effect_symbolsize=15,label_color=['#a6c84c', '#ffa022', '#46bee9'],
label_pos="right",label_formatter="{b}",label_text_color="#eee",)
data_guangzhou = [
["广州", "上海"],
["广州", "北京"],
["广州", "南京"],
["广州", "重庆"],
["广州", "兰州"],
["广州", "杭州"]
]
geolines = GeoLines("GeoLines 示例", **style.init_style)
geolines.add("从广州出发", data_guangzhou, **style_geo)
geolines.render('11.html')

地图包

另外需要注意的是从版本0.3.2 开始,为了缩减项目本身的体积以及维持 pyecharts 项目的轻量化运行,pyecharts 将不再自带地图 js 文件。如用户需要用到地图图表(Geo、Map),可自行安装对应的地图文件包。

使用命令安装

pip install echarts-countries-pypkg # 世界地图和 213 个国家
pip install echarts-china-provinces-pypkg # 中国省级地图
pip install echarts-china-cities-pypkg # 中国市级地图

使用案例

from pyecharts import Geo

city_datas = [('北京', 149), ('上海', 95), ('深圳', 77), ('成都', 22), ('杭州', 17), ('广州', 17), ('武汉', 16), ('南京', 13), ('苏州', 7),
     ('郑州', 5), ('天津', 4), ('西安', 4), ('东莞', 3), ('珠海', 2), ('合肥', 2), ('厦门', 2), ('宁波', 1), ('南宁', 1), ('重庆', 1),
     ('佛山', 1), ('大连', 1), ('哈尔滨', 1), ('长沙', 1), ('福州', 1), ('中山', 1)]
geo = Geo("国家最有钱的城市", "数据来源瞎编", title_color="#fff",
                  title_pos="center", width=1200,
                  height=600, background_color='#404a59')
attr, value = geo.cast(city_datas)
geo.add("", attr, value, visual_range=[0, 200], visual_text_color="#fff",
                symbol_size=15, is_visualmap=True)
geo.render("money_scatter.html")


geo = Geo("Money", "数据来源乱想", title_color="#fff",
                  title_pos="center", width=1200,
                  height=600, background_color='#404a59')
        attr, value = geo.cast(city_datas)
        geo.add("", attr, value, type="heatmap", visual_range=[0, 10], visual_text_color="#fff",
                symbol_size=15, is_visualmap=True)
        geo.render("money_heatmap.html")

关系图

关系图是用于展现节点以及节点之间的关系的一种图,顾名思义,它用以分析关系最为适合,比如微博转发关系,文章引用关系等。

# coding:utf-8
from __future__ import unicode_literals
from pyecharts import Graph

nodes = [{"name": "结点1", "symbolSize": 10},
         {"name": "结点2", "symbolSize": 20},
         {"name": "结点3", "symbolSize": 30},
         {"name": "结点4", "symbolSize": 40},
         {"name": "结点5", "symbolSize": 50},
         {"name": "结点6", "symbolSize": 40},
         {"name": "结点7", "symbolSize": 30},
         {"name": "结点8", "symbolSize": 20}]
links = []
for i in nodes:
    for j in nodes:
        links.append({"source": i.get('name'), "target": j.get('name')})
graph = Graph("关系图-力引导布局示例")
graph.add(
    "",
    nodes,
    links,
    is_label_show=True,
    graph_repulsion=8000,
    graph_layout="circular",
    label_text_color=None,
)
graph.render('12.html')

雷达图

雷达图多用于展示多变量数据。

# coding:utf-8
from __future__ import unicode_literals
from pyecharts import Radar

schema = [
    ("销售", 6500), ("管理", 16000), ("信息技术", 30000),
    ("客服", 38000), ("研发", 52000), ("市场", 25000)
]
v1 = [[4300, 10000, 28000, 35000, 50000, 19000]]
v2 = [[5000, 14000, 28000, 31000, 42000, 21000]]
radar = Radar()
radar.config(schema)
radar.add("预算分配", v1, is_splitline=True, is_axisline_show=True)
radar.add("实际开销", v2, label_color=["#4e79a7"], is_area_show=False,
          legend_selectedmode='single')
radar.render('13.html')

词云图

# encoding:utf-8
from pyecharts import WordCloud
name = ['浪子','好帅啊','真的好帅啊','妈耶这么太帅了吧']
value = [15,10,9,3]
wordcloud = WordCloud(width=1300, height=620)
wordcloud.add("", name, value, word_size_range=[20, 100])
#wordcloud.add("", name, value, word_size_range=[30, 100],shape='diamond')
# 这样就是正正的显示出来
wordcloud.render("10.html")

原版词云

首先先安装

pip install wordcloud 

在pip install 失败时,cmd明确指出了error:Microsoft Visual C++ 14.0 is required. 而且在error后面还提供了该文件的下载地址,进入下载地址页面下载后安装再重新pip install wordcloud 即可成功。
个人觉得这个才是治本的方案,尽管在安装Microsoft Visual C++ 14.0时有些慢。

相关参数

class wordcloud.WordCloud(font_path=None, width=400, height=200, margin=2, ranks_only=None, prefer_horizontal=0.9,mask=None, scale=1, color_func=None, max_words=200, min_font_size=4, stopwords=None, random_state=None,background_color='black', max_font_size=None, font_step=1, mode='RGB', relative_scaling=0.5, regexp=None, collocations=True,colormap=None, normalize_plurals=True)

参数作用

font_path : string //字体路径,需要展现什么字体就把该字体路径+后缀名写上,如:font_path = '黑体.ttf'

width : int (default=400) //输出的画布宽度,默认为400像素

height : int (default=200) //输出的画布高度,默认为200像素

prefer_horizontal : float (default=0.90) //词语水平方向排版出现的频率,默认 0.9 (所以词语垂直方向排版出现频率为 0.1 )

mask : nd-array or None (default=None) //如果参数为空,则使用二维遮罩绘制词云。如果 mask 非空,设置的宽高值将被忽略,遮罩形状被 mask 取代。除全白(#FFFFFF)的部分将不会绘制,其余部分会用于绘制词云。如:bg_pic = imread('读取一张图片.png'),背景图片的画布一定要设置为白色(#FFFFFF),然后显示的形状为不是白色的其他颜色。可以用ps工具将自己要显示的形状复制到一个纯白色的画布上再保存,就ok了。

scale : float (default=1) //按照比例进行放大画布,如设置为1.5,则长和宽都是原来画布的1.5倍。

min_font_size : int (default=4) //显示的最小的字体大小

font_step : int (default=1) //字体步长,如果步长大于1,会加快运算但是可能导致结果出现较大的误差。

max_words : number (default=200) //要显示的词的最大个数

stopwords : set of strings or None //设置需要屏蔽的词,如果为空,则使用内置的STOPWORDS

background_color : color value (default=”black”) //背景颜色,如background_color='white',背景颜色为白色。

max_font_size : int or None (default=None) //显示的最大的字体大小

mode : string (default=”RGB”) //当参数为“RGBA”并且background_color不为空时,背景为透明。

relative_scaling : float (default=.5) //词频和字体大小的关联性

color_func : callable, default=None //生成新颜色的函数,如果为空,则使用 self.color_func

regexp : string or None (optional) //使用正则表达式分隔输入的文本

collocations : bool, default=True //是否包括两个词的搭配

colormap : string or matplotlib colormap, default=”viridis” //给每个单词随机分配颜色,若指定color_func,则忽略该方法。

fit_words(frequencies)  //根据词频生成词云
generate(text)  //根据文本生成词云
generate_from_frequencies(frequencies[, ...])   //根据词频生成词云
generate_from_text(text)    //根据文本生成词云
process_text(text)  //将长文本分词并去除屏蔽词(此处指英语,中文分词还是需要自己用别的库先行实现,使用上面的 fit_words(frequencies) )
recolor([random_state, color_func, colormap])   //对现有输出重新着色。重新上色会比重新生成整个词云快很多。
to_array()  //转化为 numpy array
to_file(filename)   //输出到文件

从这个文本中生成一个词云,代码如下:

#!/usr/bin/python
# -*- coding: utf-8 -*-
#coding=utf-8
#导入wordcloud模块和matplotlib模块
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from scipy.misc import imread
#读取一个txt文件
text = open('test.txt','r').read()
#读入背景图片
bg_pic = imread('3.png')
#生成词云
wordcloud = WordCloud(mask=bg_pic,background_color='white',scale=1.5).generate(text)
image_colors = ImageColorGenerator(bg_pic)
#显示词云图片
plt.imshow(wordcloud)
plt.axis('off')
plt.show()
#保存图片
wordcloud.to_file('test.jpg')

参考链接

总结

常用的方法就这么一些,使用步骤都差不多,先实例化对象,然后add,最后render。关于更加详细的用法请移步官方文档。

官方文档

坚持原创技术分享,您的支持将鼓励我继续创作!
------ 本文结束 ------

版权声明

LangZi_Blog's by Jy Xie is licensed under a Creative Commons BY-NC-ND 4.0 International License
由浪子LangZi创作并维护的Langzi_Blog's博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证
本文首发于Langzi_Blog's 博客( http://langzi.fun ),版权所有,侵权必究。

0%