进行数据处理的时候,可视化是非常重要的数据分析方式,但是有时候在处理大批量的数据时,由于数据量过多,数据往往会非常密集,而不能发现有效信息,而我们经常使用的matplotlib不能满足这样的需求,这就需要交互式的可视化方案,提供比较方便和快捷的数据可视化操作。前几天在处理数据的时候,需要实现数据可以滑动或者选择查看,就发现了几个python实现交互式可视化的库,跟大家分享一下。 首先简单介绍一下python的可视化的分类。在Python语言环境里,有不少可视化解决方案,主要的可以大致分为几类:
•基于maplotlib的可视化库,例如经常使用的matplotlib,seaborn以及pandas和scikit-plot的绘图•基于JavaScript的可视化库,例如broken,plotly(DASH)以及pyecharts等库,可以实现交互式的可视化操作•基于上述两者或其他组合功能的库,例如holoviews可以和Seaborn,pandas或者broken组合使用下图是Jake VanderPlas在2017年对python可视化解决方案的总结,有些新的包没有包含,可以作为参考
图片来源于https://speakerdeck.com/jakevdp/pythons-visualization-landscape-pycon-2017
我在解决python交互式的可视化问题时,主要用到的是基于JavaScript的可视化库pyecharts。pyecharts 是一个用于生成 Echarts 图表的类库。Echarts 是百度开源的一个数据可视化 JS 库。用 Echarts 生成的图可视化效果非常棒,pyecharts 是为了与 Python 进行对接,方便在 Python 中直接使用数据生成图。使用pyecharts可以生成独立的网页,也可以在flask、django中集成使用 ,此外也可以直接利用render_notebook,直接在jupyter notebook里调用渲染。
pyecharts 分为 v0.5.X 和 v1 两个大版本,v0.5.X 和 v1 间不兼容,v1 是一个全新的版本。其中v0.5.X支持python2.7和3.4+,未来不再进行维护,v1仅支持python3.6+,是以后版本迭代的基础。 安装利用pip,利用conda安装没有成功
$ pip install pyecharts
或源码安装
$ git clone https://github.com/pyecharts/pyecharts.git
$ cd pyecharts
$ pip install -r requirements.txt
$ python setup.py install
# 或者执行 python install.py
from pyecharts.charts import Bar
bar = Bar()
bar.add_xaxis(["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"])
bar.add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
bar.add_yaxis("商家B", [8, 15, 49, 15, 65, 80])
bar.render('bar.html')
render 会生成本地 HTML 文件,默认会在当前目录生成 render.html 文件吗,也可以传入路径参数,如 bar.render("bar.html"),此外如果使用的是juypter notebook 可以直接reader_notebook在jupyter里面渲染。打开html文件:
这是两个商家不同衣服销量对比的柱状图,可以查看数值的详细信息,以及对不同的项目进行选择。 接下来参考官方的示例,对常用的图表进行简单示范:
柱状图可以进行对比分析,数据是对于不同地级市的观测和预报数据,由于数据太多,单独画在一个图片中,将会非常拥挤,无法清晰看出差距,就需要借助于交互式的图像方案:
from pyecharts import options as opts
from pyecharts.charts import Bar
def bar_test(df) -> Bar:
c = (
Bar()
.add_xaxis(df.index.tolist())
.add_yaxis("观测", df['气温观测'].tolist(),category_gap="10%", gap="5%")
.add_yaxis("预报", df['气温预测'].tolist(), category_gap="10%", gap="5%")
.set_global_opts(
title_opts=opts.TitleOpts(title="地级市气温观测与预报分析"),
toolbox_opts=opts.ToolboxOpts(),#添加右上角的工具选项
yaxis_opts=opts.AxisOpts(name="气温"),
xaxis_opts=opts.AxisOpts(name="城市"),
datazoom_opts=[opts.DataZoomOpts(),opts.DataZoomOpts(orient="vertical"), opts.DataZoomOpts(type_="inside")]#增添x,y轴以及内部的缩放
)
.set_series_opts(
label_opts=opts.LabelOpts(is_show=False),
markline_opts=opts.MarkLineOpts(
data=[
opts.MarkLineItem(type_="min", name="最小值"),
opts.MarkLineItem(type_="max", name="最大值"),
opts.MarkLineItem(type_="average", name="平均值"),
]
),#添加标示线
markpoint_opts=opts.MarkPointOpts(
data=[
opts.MarkPointItem(type_="max", name="最大值"),
opts.MarkPointItem(type_="min", name="最小值"),
opts.MarkPointItem(type_="average", name="平均值"),
]
)
)#添加标示点
)
return c
c=bar_datazoom_slider_vertical(data)
c.render_notebook()
选择不同的数据
选择不同的范围
对于不同地级市观测和预报的气温进行对比画图,在图中我们可以选择观测或者预报数据,缩小x范围,查看局部的差异,或者选定y轴范围,查看不同温度范围的数值分布,右上角的工具可以提供图像的放大和存储以及原始数据的查看。
#堆叠柱状图
def bar_datazoom_slider_vertical(df) -> Bar:
c = (
Bar()
.add_xaxis(df.index.tolist())
.add_yaxis("3月", df['3月份降水观测'].tolist(),category_gap="10%", gap="5%", stack="stack1")
.add_yaxis("4月", df['4月份降水观测'].tolist(), category_gap="10%", gap="5%", stack="stack1")
.add_yaxis("5月", df['5月份降水观测'].tolist(), category_gap="10%", gap="5%", stack="stack1")
.set_global_opts(
title_opts=opts.TitleOpts(title="地级市降水春季分析"),
toolbox_opts=opts.ToolboxOpts(),
yaxis_opts=opts.AxisOpts(name="降水"),
xaxis_opts=opts.AxisOpts(name="城市"),
datazoom_opts=[opts.DataZoomOpts(),opts.DataZoomOpts(orient="vertical"), opts.DataZoomOpts(type_="inside")]
)
.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
)
return c
c=bar_datazoom_slider_vertical(data.iloc)
c.render_notebook()
选择不同的月份
查看局部的数据
图中是3,4,5三个月的降水累计分布图,可以选择不同的月份,查看局部的分布或者特定降水范围的数据
箱式图可以查看两个数据的统计属性是否一致,包括均值,最值,中值等
from pyecharts import options as opts
from pyecharts.charts import Boxplot
def boxpolt_base() -> Boxplot:
v1 = [
[850, 740, 900, 1070, 930, 850, 950, 980, 980, 880]
+ [1000, 980, 930, 650, 760, 810, 1000, 1000, 960, 960],
[960, 940, 960, 940, 880, 800, 850, 880, 900]
+ [840, 830, 790, 810, 880, 880, 830, 800, 790, 760, 800],
]
v2 = [
[890, 810, 810, 820, 800, 770, 760, 740, 750, 760]
+ [910, 920, 890, 860, 880, 720, 840, 850, 850, 780],
[890, 840, 780, 810, 760, 810, 790, 810, 820, 850, 870]
+ [870, 810, 740, 810, 940, 950, 800, 810, 870],
]
c = Boxplot()
c.add_xaxis(["expr1", "expr2"]).add_yaxis("A", c.prepare_data(v1)).add_yaxis(
"B", c.prepare_data(v2)
).set_global_opts(title_opts=opts.TitleOpts(title="BoxPlot-基本示例"))
return c
c=boxpolt_base()
c.render_notebook()
从图中可以清晰看到每个统计属性
from pyecharts import options as opts
from pyecharts.charts import Line
def line_test(df) -> Line:
c = (
Line()
.add_xaxis(df.index.tolist())
.add_yaxis("观测", df['气温观测'].tolist(),linestyle_opts=opts.LineStyleOpts(color="k", width=2))
.add_yaxis("预报", df['气温预测'].tolist(),linestyle_opts=opts.LineStyleOpts(color="red", width=2))
.set_global_opts(
title_opts=opts.TitleOpts(title="地级市气温观测与预报分析"),
toolbox_opts=opts.ToolboxOpts(),
yaxis_opts=opts.AxisOpts(name="气温"),
xaxis_opts=opts.AxisOpts(name="城市"),
datazoom_opts=[opts.DataZoomOpts(),opts.DataZoomOpts(orient="vertical"), opts.DataZoomOpts(type_="inside")]
)
.set_series_opts(
label_opts=opts.LabelOpts(is_show=False),
markline_opts=opts.MarkLineOpts(
data=[
opts.MarkLineItem(type_="min", name="最小值"),
opts.MarkLineItem(type_="max", name="最大值"),
opts.MarkLineItem(type_="average", name="平均值"),
]
),
markpoint_opts=opts.MarkPointOpts(
data=[
opts.MarkPointItem(type_="max", name="最大值"),
opts.MarkPointItem(type_="min", name="最小值"),
opts.MarkPointItem(type_="average", name="平均值"),
]
)
)
)
return c
c=line_test(data)
c.render_notebook()
滑动x轴查看局部信息
滑动y轴查看不同的取值范围
图中是不同地级市观测与预报数据的折线图,可以通过滑动x轴查看局部的趋势和数值,设定y轴,查看特定温度范围的数据
散点图可以查看分布的趋势
# 散点图
from pyecharts import options as opts
from pyecharts.charts import Scatter
def scatter_visualmap_color(df) -> Scatter:
c = (
Scatter()
.add_xaxis(df.index.tolist())
.add_yaxis("观测", df['降水观测'].tolist())
.add_yaxis("预报", df['降水预测'].tolist())
.set_global_opts(
title_opts=opts.TitleOpts(title="Scatter-VisualMap(Size)"),
visualmap_opts=opts.VisualMapOpts(type_="size", max_=150, min_=20),
)
)
return c
c=scatter_visualmap_color(data.iloc[::20])
c.render_notebook()
大小可调节的散点图
图中是不同地级市,观测与预报气温的散点图,大小表示气温的高低,通过左方的调节bar,可以选择一定范围的气温,进行查看分布
import random
from example.commons import Faker
from pyecharts import options as opts
from pyecharts.charts import HeatMap
def heatmap_base() -> HeatMap:
value = [[i, j, random.randint(0, 50)] for i in range(24) for j in range(7)]
c = (
HeatMap()
.add_xaxis(Faker.clock)
.add_yaxis("series0", Faker.week, value)
.set_global_opts(
title_opts=opts.TitleOpts(title="HeatMap-基本示例"),
visualmap_opts=opts.VisualMapOpts(),
)
)
return c
c=heatmap_base()
c.render_notebook()
热力图
由于我的样例数据没有提供相关的信息,就借用官方的示例数据进行简单展示,可以应用于数据缺失或频率的一个展示
地理区划图
地理线图
3D展示