如何做Python 的数据可视化?
pyecharts 是一个用于生成 Echarts 图表的类库。 Echarts 是百度开源的一个数据可视化 JS 库。主要用于数据可视化。
pyecharts 兼容 Python2 和 Python3。目前版本为 0.1.4
Bar(柱状图/条形图) Bar3D(3D 柱状图) Boxplot(箱形图) EffectScatter(带有涟漪特效动画的散点图) Funnel(漏斗图) Gauge(仪表盘) Geo(地理坐标系) Graph(关系图) HeatMap(热力图) Kline(K线图) Line(折线/面积图) Line3D(3D 折线图) Liquid(水球图) Map(地图) Parallel(平行坐标系) Pie(饼图) Polar(极坐标系) Radar(雷达图) Sankey(桑基图) Scatter(散点图) Scatter3D(3D 散点图) ThemeRiver(主题河流图) WordCloud(词云图)
2.公共属性
1.标题栏的属性:一般在实例化(初始化)类型时给与,如bar = Bar(“大标题”,“副标题”,···各种属性···)
title_color = “颜色”:标题颜色,可以是‘red’或者‘#0000’
title_pos = ‘位置’:标题位置,如‘center’,‘left’···
width = 1200:图表的宽
height = 800:图表的高
background_color = "颜色":图表的背景色
·····
2、标签栏的属性:
bar.add(“标签”,x,values,···属性···)
'mark_'类,通个'mark_'显示,如 mark_point['max', 'min', 'average']:标出最大最小和平均值的点,
mark_point_textcolor,mark_line_symbolsize·····
'legend_'类,如legend_pos=‘left’:标签的位置
'is_'类,如is_label_show=True:显示每个点的值,is_datazoom_show=True:实现移动控制x轴的数量
is_convert = True:x,y轴是否调换
1.首先开始来绘制你的第一个图表
from pyecharts import Bar
bar =Bar("我的第一个图表", "这里是副标题")
bar.use_theme('dark') #设置背景色
bar.add("服装", ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"], [5, 20, 36, 10, 75, 90])
bar.show_config()#打印输出图表的所有配置项
bar.render()#默认将会在根目录下生成一个 render.html 的文件
Tip:可以按右边的下载按钮将图片下载到本地
add()主要方法,用于添加图表的数据和设置各种配置项
show_config()打印输出图表的所有配置项
render()默认将会在根目录下生成一个 render.html 的文件,支持 path 参数,设置文件保存位置,如 render(r"e:my_first_chart.html"),文件用浏览器打开.默认的编码类型为 UTF-8,在 Python3 中是没什么问题的,Python3 对中文的支持好很多。但是在 Python2 中,编码的处理是个很头疼的问题,暂时没能找到完美的解决方法,目前只能通过文本编辑器自己进行二次编码,我用的是 Visual Studio Code,先通过 Gbk 编码重新打开,然后再用 UTF-8 重新保存,这样用浏览器打开的话就不会出现中文乱码问题了。
基本上所有的图表类型都是这样绘制的:
chart_name = Type() 初始化具体类型图表。
add() 添加数据及配置项。
render() 生成 .html 文件。
某地区的降水量,并转换x,y轴
attr = ['{}月'.format(i) for i in range(1,13)]
v1 = [2.0,4.9,7.0,23.2,25.6,76.7,135.6,162.2,32.6,20.0,6.4,3.3]
v2 = [2.6,5.9,9.0,26.4,28.7,70.7,175.6,182.8,48.7,18.8,6.0,2.3]
bar = Bar("柱状图示例")
bar.add("蒸发量", attr,v1,mark_line = ['average'],mark_point = ["max","min"])#画平均线,标记最大最小值
bar.add("降水量", attr,v2,mark_line = ['average'],mark_point = ["max","min"])
bar.render()
bar = Bar("x 轴和 y 轴交换") #print交换x轴和y轴
bar.add("蒸发量", attr, v1,mark_line = ['average'],mark_point = ["max","min"])
bar.add("降水量", attr, v2,mark_line = ['average'],mark_point = ["max","min"], is_convert=True)#is_convert是否转换
bar.render()
from pyecharts import Pie
attr =["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"]v1 =[11, 12, 13, 10, 10, 10]pie =Pie("饼图示例")
pie.add("", attr, v1, is_label_show=True)
pie.show_config()
pie.render()
attr =["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"]
v1 =[11, 12, 13, 10, 10, 10]
v2 =[19, 21, 32, 20, 20, 33]
pie =Pie("饼图实例2-玫瑰图示例", title_pos='center', width=900,title_text_size=40)#标题,title_pos调整标题位置,title_text_size调整主标题文字大小
pie.add("商品A",attr,v1,center=[25, 50], is_random=True, radius=[30, 75], rosetype='radius')
pie.add("商品B",attr,v2,center=[75, 50], is_random=True, radius=[30, 75], rosetype='area', is_legend_show=False, is_label_show=True)
pie.show_config()
pie.render()
#attr为不同的属性名称; v为从表格读出来的,不同属性对用的数据;center为调整饼图圆心坐标; is_random为是否随即排列颜色列表(bool);
2.各类电影中"好片"所占的比例
from pyecharts import Pie pie =Pie('各类电影中"好片"所占的比例', "数据来着豆瓣", title_pos='center') pie.add("", ["剧情", ""], [25, 75], center=[10, 30], radius=[18, 24], label_pos='center', is_label_show=True, label_text_color=None, ) pie.add("", ["奇幻", ""], [24, 76], center=[30, 30], radius=[18, 24], label_pos='center', is_label_show=True, label_text_color=None, legend_pos='left') pie.add("", ["爱情", ""], [14, 86], center=[50, 30], radius=[18, 24], label_pos='center', is_label_show=True, label_text_color=None) pie.add("", ["惊悚", ""], [11, 89], center=[70, 30], radius=[18, 24], label_pos='center', is_label_show=True, label_text_color=None) pie.add("", ["冒险", ""], [27, 73], center=[90, 30], radius=[18, 24], label_pos='center', is_label_show=True, label_text_color=None) pie.add("", ["动作", ""], [15, 85], center=[10, 70], radius=[18, 24], label_pos='center', is_label_show=True, label_text_color=None) pie.add("", ["喜剧", ""], [54, 46], center=[30, 70], radius=[18, 24], label_pos='center', is_label_show=True, label_text_color=None) pie.add("", ["科幻", ""], [26, 74], center=[50, 70], radius=[18, 24], label_pos='center', is_label_show=True, label_text_color=None) pie.add("", ["悬疑", ""], [25, 75], center=[70, 70], radius=[18, 24], label_pos='center', is_label_show=True, label_text_color=None) pie.add("", ["犯罪", ""], [28, 72], center=[90, 70], radius=[18, 24], label_pos='center', is_label_show=True, label_text_color=None, is_legend_show=True, legend_top="center") pie.show_config() pie.render()
这段代码参考简书网 https://www.jianshu.com/p/b718c307a61c ,强烈推荐大家学习chenjiandongx大神的文章。完整代码如下:
1.绘制3D折线图代码如下:
2.
from pyecharts import Scatter v1 =[10, 20, 30, 40, 50, 60] v2 =[10, 20, 30, 40, 50, 60] scatter =Scatter("散点图示例") scatter.add("A", v1, v2) scatter.add("B", v1[::-1], v2) scatter.show_config() scatter.render()
3.散点打印Pyecharts字体
from pyecharts import Scatter scatter =Scatter("散点图示例") v1, v2 =scatter.draw("F://anacondadaima//keshihua//1.png") scatter.add("pyecharts", v1, v2, is_random=True) scatter.show_config() scatter.render()
6.仪表盘
代码如下:
输出图形如下所示:
1.水球图
代码如下:
输出如下图所示:
from pyecharts import Liquid
liquid =Liquid("水球图示例")
liquid.add("Liquid", [0.6, 0.5, 0.4, 0.3], is_liquid_outline_show=False)
liquid.show_config()
liquid.render()
3.水球图
from pyecharts import Liquid liquid =Liquid("水球图示例3") liquid.add("Liquid",[0.6, 0.5, 0.4, 0.3],is_liquid_animation=False,shape='diamond') liquid.show_config() liquid.render()
如果直接绘制中国地图,只会显示一个角落,如下图所示:
1.安装
这是需要安装第三方地图支持包,代码如下:
pip install echarts-countries-pypkg
pip install echarts-china-provinces-pypkg
pip install echarts-china-cities-pypkg
echarts-china-cities-pypkg是中国城市地图。安装过程如下图所示:
2.绘制中国地图
安装之后我们来看一个简单的中国地图代码,这是作者微信好友全国各省分布情况,代码如下:
再来看一组中国地图,全国的空气质量情况,代码如下:
输出结果如下所示,它会提示错误“coordinates is not found”坐标没有定义,知乎说可以用 geo_cities_coords 参数自定义经纬度处理解决。
3.绘制贵州地图
最后补充绘制贵州省地图的代码:
输出如下图所示:
1.力引导布局
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("关系图1",nodes,links,is_label_show=True,repulsion=8000,layout='circular',label_text_color=None) graph.show_config() graph.render()
2.微博转发关系图(没有实现)
from pyecharts import Graph
import json
with open("..\json\weibo.json","r",encoding="utf-8") as f:
j = json.load(f)
nodes,links,categories,cont,mid,userl = j
graph = Graph("微博转发关系图", width=1200, height=600)
graph.add("关系图2", nodes, links, categories, label_pos="right", repulsion=50, is_legend_show=False, line_curve=0.2, label_text_color=None)
graph.show_config()
graph.render()
1.阶梯图
from pyecharts import Line
attr =["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"]
v1 =[5, 20, 36, 10, 10, 100]
v2 =[55, 60, 16, 20, 15, 80]
line =Line("折线图示例")
line.add("商家A", attr, v1, mark_point=["average"])
line.add("商家B", attr, v2, is_smooth=True, mark_line=["max", "average"])
line.show_config()
line.render()
line =Line("折线图-阶梯图示例")
line.add("商家A", attr, v1, is_step=True, is_label_show=True)
line.show_config()
line.render()
2.面积图
from pyecharts import Line
attr =["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"]
v1 =[5, 20, 36, 10, 10, 100]
v2 =[55, 60, 16, 20, 15, 80]
line =Line("折线图-面积图示例")
line.add("商家A", attr, v1, is_fill=True, line_opacity=0.2, area_opacity=0.4, symbol=None)
line.add("商家B", attr, v2, is_fill=True, area_color='#000', area_opacity=0.3, is_smooth=True)
line.show_config()
line.render()
from pyecharts import Parallel c_schema = [ {"dim": 0, "name": "data"}, {"dim": 1, "name": "AQI"}, {"dim": 2, "name": "PM2.5"}, {"dim": 3, "name": "PM10"}, {"dim": 4, "name": "CO"}, {"dim": 5, "name": "NO2"}, {"dim": 6, "name": "CO2"}, {"dim": 7, "name": "等级", "type": "category", "data": ['优', '良', '轻度污染', '中度污染', '重度污染', '严重污染']}] data = [ [1, 91, 45, 125, 0.82, 34, 23, "良"], [2, 65, 27, 78, 0.86, 45, 29, "良"], [3, 83, 60, 84, 1.09, 73, 27, "良"], [4, 109, 81, 121, 1.28, 68, 51, "轻度污染"], [5, 106, 77, 114, 1.07, 55, 51, "轻度污染"], [6, 109, 81, 121, 1.28, 68, 51, "轻度污染"], [7, 106, 77, 114, 1.07, 55, 51, "轻度污染"], [8, 89, 65, 78, 0.86, 51, 26, "良"], [9, 53, 33, 47, 0.64, 50, 17, "良"], [10, 80, 55, 80, 1.01, 75, 24, "良"], [11, 117, 81, 124, 1.03, 45, 24, "轻度污染"], [12, 99, 71, 142, 1.1, 62, 42, "良"], [13, 95, 69, 130, 1.28, 74, 50, "良"], [14, 116, 87, 131, 1.47, 84, 40, "轻度污染"]] parallel = Parallel("平行坐标系-用户自定义指示器") parallel.config(c_schema = c_schema) parallel.add("parallel", data) parallel.show_config() parallel.render()
1.
from pyecharts import Polar radius =['周一', '周二', '周三', '周四', '周五', '周六', '周日'] polar =Polar("极坐标系-堆叠柱状图示例", width=1200, height=600) polar.add("A", [1, 2, 3, 4, 3, 5, 1], radius_data=radius, type='barRadius', is_stack=True) polar.add("B", [2, 4, 6, 1, 2, 3, 1], radius_data=radius, type='barRadius', is_stack=True) polar.add("C", [1, 2, 3, 4, 1, 2, 5], radius_data=radius, type='barRadius', is_stack=True) polar.show_config() polar.render()
2.
from pyecharts import Polar radius =['周一', '周二', '周三', '周四', '周五', '周六', '周日'] polar =Polar("极坐标系-堆叠柱状图示例2", width=1200, height=600) polar.add("", [1, 2, 3, 4, 3, 5, 1], radius_data=radius, type='barAngle', is_stack=True) polar.add("", [2, 4, 6, 1, 2, 3, 1], radius_data=radius, type='barAngle', is_stack=True) polar.add("", [1, 2, 3, 4, 1, 2, 5], radius_data=radius, type='barAngle', is_stack=True) polar.show_config() polar.render()
3用极坐标系画出一个蜗牛壳
import math from pyecharts import Polar data =[] for i in range(5): for j in range(101): theta =j /100*360 alpha =i *360+theta r =math.pow(math.e, 0.003*alpha) data.append([r, theta]) polar = Polar("极坐标系示例") polar.add("", data, symbol_size=0, symbol='circle', start_angle=-25, is_radiusaxis_show=False, area_color="#f3c5b3", area_opacity=0.5, is_angleaxis_show=False) polar.show_config() polar.render()
4.用极坐标系画出一个爱心
import math from pyecharts import Polar data =[] for i in range(101): theta =i /100*360 r =5*(1+math.sin(theta /180*math.pi)) data.append([r, theta]) hour = [i for i in range(1, 25)] polar =Polar("极坐标系示例", width=1200, height=600) polar.add("Love", data, angle_data=hour, boundary_gap=False,start_angle=0) polar.show_config() polar.render()
5.用极坐标系画出一朵小花
import math from pyecharts import Polar data =[] for i in range(361): t =i /180*math.pi r =math.sin(2*t) *math.cos(2*t) data.append([r, i]) polar =Polar("极坐标系示例", width=1200, height=600) polar.add("Color-Flower", data, start_angle=0, symbol=None, axis_range=[0, None], area_color="#f71f24", area_opacity=0.6) polar.show_config() polar.render()
1.
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) radar.show_config()
2.
from pyecharts import Radar value_bj = [ [55, 9, 56, 0.46, 18, 6, 1], [25, 11, 21, 0.65, 34, 9, 2], [56, 7, 63, 0.3, 14, 5, 3], [33, 7, 29, 0.33, 16, 6, 4]] value_sh = [ [91, 45, 125, 0.82, 34, 23, 1], [65, 27, 78, 0.86, 45, 29, 2], [83, 60, 84, 1.09, 73, 27, 3], [109, 81, 121, 1.28, 68, 51, 4]] c_schema = [{"name": "AQI", "max": 300, "min": 5}, {"name": "PM2.5", "max": 250, "min": 20}, {"name": "PM10", "max": 300, "min": 5}, {"name": "CO", "max": 5}, {"name": "NO2", "max": 200}, {"name": "SO2", "max": 100}] radar = Radar() radar.config(c_schema=c_schema, shape='circle') radar.add("北京", value_bj, item_color="#f9713c", symbol=None) radar.add("上海", value_sh, item_color="#b3e4a1", symbol=None) radar.show_config()
1.
from pyecharts import WordCloud name = ['Sam S Club', 'Macys', 'Amy Schumer', 'Jurassic World', 'Charter Communications', 'Chick Fil A', 'Planet Fitness', 'Pitch Perfect', 'Express', 'Home', 'Johnny Depp', 'Lena Dunham', 'Lewis Hamilton', 'KXAN', 'Mary Ellen Mark', 'Farrah Abraham', 'Rita Ora', 'Serena Williams', 'NCAA baseball tournament', 'Point Break'] value = [10000, 6181, 4386, 4055, 2467, 2244, 1898, 1484, 1112, 965, 847, 582, 555, 550, 462, 366, 360, 282, 273, 265] wordcloud = WordCloud(width=1300, height=620) wordcloud.add("", name, value, word_size_range=[20, 100]) wordcloud.show_config() wordcloud.render()