(关注公众号AI新视野,发送‘资料’二字,免费获取50G人工智能视频教程!)

本文介绍如何创建交互式图表和小组件,使用python做数据可视化。涉及的python库有:Plotly, Bokeh, nbinteract等。

数据可视化

分析数据集的时候,数据可视化是很重要的一步。如果做得好的话,有很多好处:

  • 帮我们更深入的理解那些隐藏在数据集中的动态变化
  • 这些分析工作,能让你后续的机器学习更高效
  • 让别人更容易的理解我们的数据

在这篇文章中,我将用一些实际的例子和有趣的可视化方法,来向你介绍python中最常用的数据可视化库。文中提到的代码你可以在github中找到:

github 地址[1]

Matplotlib

Matplotlib 可能是最广为人知的Python数据可视化库。举个例子,我将向你介绍如何创建一张PCA方差GIF图。

首先,我们必须使用Seaborn加载Iris数据集并且执行PCA。成功之后,我们将通过从轴上改变不同角度观察,绘制20张PCA方差图。为了去创建3D的PCA结果图,我把 The Python Graph Gallery当作参考。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import seaborn as sns
import os
from sklearn.decomposition import PCA
import imageiodf = sns.load_dataset('iris')my_dpi=96
plt.figure(figsize=(480/my_dpi, 480/my_dpi), dpi=my_dpi)# Keep the 'specie' column appart + make it numeric for coloring
df['species']=pd.Categorical(df['species'])
my_color=df['species'].cat.codes
df = df.drop('species', 1)# Run The PCA
pca = PCA(n_components=3)
pca.fit(df)# Store results of PCA in a data frame
result=pd.DataFrame(pca.transform(df), columns=['PCA%i' % i for i in range(3)], index=df.index)# 20 plots, for 20 different angles
for angle in range(70,210,2):# Plot initialisationfig = plt.figure()ax = fig.add_subplot(111, projection='3d')ax.scatter(result['PCA0'], result['PCA1'], result['PCA2'], c=my_color, cmap="Set2_r", s=60)# make simple, bare axis lines through space:xAxisLine = ((min(result['PCA0']), max(result['PCA0'])), (0, 0), (0,0))ax.plot(xAxisLine[0], xAxisLine[1], xAxisLine[2], 'r')yAxisLine = ((0, 0), (min(result['PCA1']), max(result['PCA1'])), (0,0))ax.plot(yAxisLine[0], yAxisLine[1], yAxisLine[2], 'r')zAxisLine = ((0, 0), (0,0), (min(result['PCA2']), max(result['PCA2'])))ax.plot(zAxisLine[0], zAxisLine[1], zAxisLine[2], 'r')ax.view_init(30,angle)# label the axesax.set_xlabel("PC1")ax.set_ylabel("PC2")ax.set_zlabel("PC3")ax.set_title("PCA Iris Dataset")filename='PCA/PCA_angle'+str(angle)+'.png'plt.savefig(filename, dpi=96)

最终,我们可以通过下面的这个函数从我们的20个图中生成GIF。

def make_gif(input_folder, save_filepath):episode_frames = []time_per_step = 0.25for root, _, files in os.walk(input_folder):file_paths = [os.path.join(root, file) for file in files]#sorted by modified timefile_paths = sorted(file_paths, key=lambda x: os.path.getmtime(x))episode_frames = [imageio.imread(file_path) for file_path in file_paths if file_path.endswith('.png')]episode_frames = np.array(episode_frames)imageio.mimsave(save_filepath, episode_frames, duration=time_per_step)make_gif('./PCA/', './PCA/PCA.gif')

获得的结果应该和图1的结果相同。这种相同的机制可以应用于其他很多应用,就像:动画分布,轮廓和机器学习模型。

在Matplotlib中制作动画图形的另一种方法是使用Matplotlib动画API。这个API可以制作一些简单的动画和实时图标。一些案例可以在这里[2]找到。

Celluloid

可以使用Celluloid库来简化Matplotlib中的动画。通过创建一个摄像头来实现,该摄像头的目标是在每次图形的某个参数发生变化时拍摄该图形的快照。然后,所有这些瞬间存储的图片组合在一起以生成动画。

在下面的示例中,为每个循环迭代生成快照,并使用animate() 函数创建动画。

from celluloid import Camera
import numpy as np
import matplotlib.pyplot as pltfig, axes = plt.subplots(2)
camera = Camera(fig)
t = np.linspace(0, 5 * np.pi, 128, endpoint=False)
t2 = np.linspace(0, 1 * np.pi, 128, endpoint=False)
for i in t2:axes[0].plot(t, np.cos(t/2 + i), color='b')axes[1].plot(t2, np.sin(t2 - i), color='b')camera.snap()animation = camera.animate()
animation.save('celluloid_example.gif', writer = 'imagemagick')

然后还可以使用ImageMagick将生成的动画存储为GIF。生成的动画如图2所示。

Plotly

Plotly是一个基于plotly.js的开源Python库。 Plotly有两种不同的模式:在线和离线。通过该库,我们可以使用在线模式制作无限制的离线模式图表和最多25个在线图表。在安装Plotly时,需要注册到他们的网站并获得API密钥才能开始(而不能像文中其它库一样仅仅使用pip install)。

在这篇文章中,我将向您介绍一个使用离线模式的示例,以便在很长一段时间内绘制特斯拉股票市场的高价和低价。在这里[3]可以找到我用于此示例的数据。

首先,我们需要导入所需的Plotly库。

接下来,我导入数据集并对其进行预处理,以便实现最终的绘图。在本例中,要确保用于绘图的列是正确的数据类型,日期的格式是(YYYY-MM-DD)。为此,我将高低价格列转换为双数据类型,将日期列转换为字符串格式。随后,我将日期列从DD/MM/YYYY格式转换为YYYY/MM/DD格式,最后转换为YYYY-MM-DD格式。

import plotly.graph_objs as go
from plotly.offline import init_notebook_mode, iplot
init_notebook_mode(connected=True)
import plotly.plotly as py
import plotly
import pandas as pd
import datetimedf = pd.read_csv("TSLA.csv")df['date'] = df['date'].astype('str')
df['high'] = df['high'].astype('double')
df['low'] = df['low'].astype('double') date2 = []
for i in df['date']:new_date = datetime.datetime.strptime(i, "%d/%m/%Y").strftime("%Y-%m-%d")date2.append(new_date)df['date'] = df['date'].str.replace('/', '-')
df['date'] = date2
df.fillna(0)
df.head()

最后,我使用Plotly库来生成特斯拉股票市场高价和低价的时间序列表。感谢Plotly,这个表将是可互动的。将光标移动到时间轴的任意一点我们都可以得到高价和低价,并且选择按钮和滑块可以改变问哦们想要关注的时间范围。

trace_high = go.Scatter(x=df.date,y=df['high'],name = "TSLA High",line = dict(color = '#17BECF'),opacity = 0.8)trace_low = go.Scatter(x=df.date,y=df['low'],name = "TSLA Low",line = dict(color = '#7F7F7F'),opacity = 0.8)data = [trace_high,trace_low]layout = dict(title='Time Series with Rangeslider',xaxis=dict(rangeselector=dict(buttons=list([dict(count=1,label='1m',step='month',stepmode='backward'),dict(count=6,label='6m',step='month',stepmode='backward'),dict(step='all')])),rangeslider=dict(visible = True),type='date')
)fig = dict(data=data, layout=layout)
iplot(fig, filename = "Time Series with Rangeslider")
plotly.offline.plot(fig, filename='Plotly_Stock.html')

图4展示了最终结果。Plotly官方文档提供了大量有关如何更好的使用这个库的例子,他们中的一些可以在这里[4]找到。

Bokeh

Bokeh库同时支持Python和JavaScript。它的大多数图形,交互和小部件都可以用Python实现,但是在一些情况中也要用到JavaScript。

当使用Bokeh时,通过将一个图层堆叠到另一个图层上来构建图形。我们一开始创建一个图形,然后我们在上面添加元素(字形)。图形可以时任何的形式和形状(例如线,条,圆),取决于我们尝试去制作的图形。

当使用Bokeh创建图形时,会自动生成一些工具来绘制图形。他们有:Bokeh文档的参考链接,平移,框缩放,滚轮缩放,保存选项和重置图形按钮(和Plotly类似)。

作为一个实际的例子,我将介绍如何使用和Plotly一样的数据来绘制交互式时间序列图。

对于此演示,将绘制四个不同的时间序列(高/低/开盘价和收盘价)并且将创建四个复选框。用这种方式,使用者可以使用选中或取消复选框来让四个轴中 的任何一个从图中消失。

举个例子,为了实现复选框功能,使用JavaScript而不是Python。

import pandas as pd
import numpy as np
from bokeh.plotting import figure
from bokeh.io import output_file, show, output_notebook
from bokeh.models import CustomJS
from bokeh.models.widgets import CheckboxGroup
from bokeh.layouts import row
from bokeh.palettes import Viridis4
from bokeh.models.annotations import Title, Legenddf = pd.read_csv("TSLA.csv")df['date'] = pd.to_datetime(df['date'], format='%d/%m/%Y')p = figure(x_axis_type='datetime', plot_width=800)
aline = p.line(df['date'], df['high'], line_width=2, color=Viridis4[0])
bline = p.line(df['date'], df['low'], line_width=2, color=Viridis4[1])
cline = p.line(df['date'], df['open'], line_width=2, color=Viridis4[2])
dline = p.line(df['date'], df['close'], line_width=2, color=Viridis4[3])p.yaxis.axis_label = 'Price'
p.xaxis.axis_label = 'Time Span'legend = Legend(items=[("High Price",   [aline]),("Low Price", [bline]),("Open Price", [cline]),("Close Price", [dline])
], location=(0, 450))t = Title()
t.text = 'Tesla Stock Market Analysis'
p.title = tp.add_layout(legend, 'left')checkboxes = CheckboxGroup(labels=list(['High Price', 'Low Price', 'Open Price', 'Close Price']), active=[0, 1, 2, 3])
callback = CustomJS(code="""aline.visible = false; // aline and etc.. are bline.visible = false; // passed in from argscline.visible = false; dline.visible = false;// cb_obj is injected in thanks to the callbackif (cb_obj.active.includes(0)){aline.visible = true;} // 0 index box is alineif (cb_obj.active.includes(1)){bline.visible = true;} // 1 index box is blineif (cb_obj.active.includes(2)){cline.visible = true;} // 2 index box is cline etc...if (cb_obj.active.includes(3)){dline.visible = true;}""",args={'aline': aline, 'bline': bline, 'cline': cline, 'dline': dline})
checkboxes.js_on_click(callback)
output_file('Tesla_Stock_Widget.html')
show(row(p, checkboxes))

图5展示了结果图

如上面的代码展示的,这个图还可以另存为HTML文件。这个相同的选项也可以在Plotly中使用。如果你有兴趣测试你自己对于Plotly和Bokeh的了解,他们都可以在这里[5]找到。

Plotly和Bokeh都可以被另外用作Python的仪表板框架,创建出非常惊人的结果。

Seaborn

Seaborn 是一个建立在Matplotlib之上的python库,用于制作统计图表。根据Seaborn官网的介绍:

如果Matplotlib"尝试让简单的事情变简单,让复杂的事情成为可能",那么Seaborn就尝试制作一些明确的定义,让复杂的事情也变得简单

在这里,我不会给你详细的介绍使用Seaborn的例子,如果你正想要了解Seaborn,推荐你查看这个:Seaborn 例子汇总[6]

在下面的例子中,我首先使用Seaborn加载了Iris 数据集[7],然后制作了pair-plot。

import seaborn as sns
sns.set(style="ticks")df = sns.load_dataset("iris")
sns.pairplot(df, hue="species")

一个pair-plot是一个函数,用来展现数据集中一对对变量的图形化摘要。它用到了散点图和代表了一个个矩阵对角线的单变量分布。具体的结果展现在图6:

nbinteract

nbinteract可以让我们在Jupiter Notebook上创建交互式小部件。如果需要,也可以用HTML导出这些小部件。可以在这里[8]找到nbinteract在线实现的实例。

作为一个简单的实现,这里将创建一个下拉菜单。更改所有汽车数量的选择或者实时更新车主的名字。(图7)

from ipywidgets import interact
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
import nbinteract as nbidef cars(name, number):return '{} has {} cars!'.format(name, number)interact(cars, name='Nemo', number={'Zero': 0, 'Two': 2, 'Three': 3, 'Ten': 10});

Additional库

除了已经提到的库外,Pygal[9]Altair[10]也是常用的Python库。他们都提供了与之前类似的图,但是他们被可以用来创建其他种类的图形,例如:金字塔图,树状图,地图和甘特图。


参考资料

[1] github repository: https://github.com/pierpaolo28/Data-Visualization/tree/master/Python%20Visualization%20Libraries?source=post_page---------------------------

[2] 这里: https://www.yanxishe.com/TextTranslation/1942

[3] 在这里: https://www.macrotrends.net/stocks/charts/TSLA/tesla/stock-price-history?source=post_page---------------------------

[4] 这里: https://plot.ly/python/?source=post_page---------------------------

[5] 这里: https://pierpaolo28.github.io/Projects/project11.html?source=post_page---------------------------

[6] Seaborn 例子汇总: https://seaborn.pydata.org/examples/index.html?source=post_page---------------------------

[7] Iris 数据集: https://www.kaggle.com/arshid/iris-flower-dataset?source=post_page---------------------------

[8] 这里: https://pierpaolo28.github.io/Projects/interactivewidgets.html?source=post_page---------------------------

[9] Pygal: http://pygal.org/en/stable/documentation/index.html?source=post_page---------------------------

[10] Altair: https://altair-viz.github.io/gallery/index.html?source=post_page---------------------------

python动态心形代码_Python实现酷炫的动态交互式数据可视化,附代码!相关推荐

  1. python小数点进位小学数学_python小数的进位与舍去的介绍(附代码)

    本篇文章给大家带来的内容是关于python小数的进位与舍去的介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 一.基础知识准备 奇进偶舍,又称为四舍六入五成双规则.银行进 ...

  2. python发送短信内容_Python实现发短信的方法介绍(附代码)

    本篇文章给大家带来的内容是关于Python发短信的方法介绍(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. #首先注册互亿无线,然后复制发短信界面右上角的apiid和apik ...

  3. python字典统计男女比例_Python 自动统计微博抽奖中奖男女比例(附代码)

    今天来写一个自动计算微博抽奖男女比例的代码,很早就应该发这篇了,只是不想蹭热点(才不是拖更). 整个的过程大概分为三步: S1:从抽奖公示页获取所有中奖者的微博ID S2:由每个中奖者的微博ID进入其 ...

  4. Vega数据可视化工具——教你轻松玩转大数据可视化 | 附代码

    首发地址:https://yq.aliyun.com/articles/145929 目前我们处于信息时代,万物联网的时代已经到来.从我们的日常生活中可以发现,小到身边的智能家居,再到平时出行的共享单 ...

  5. python合成心形_python如何绘制心形

    python绘制心形的方法:利用matplotlib和numpy画心形,代码为[init = np.arange(-np.pi, np.pi, 0.001);plt.fill_between(x, y ...

  6. Python动态心形图形-快去表白吧

    Python打印抖音Excel动态心形 各位快拿去用吧. 最后一个np.arange(start, stop, step)中,stop是50的时候是最密集的时候,是一个类似于唇形的,超过50以后就会回 ...

  7. 用python绘制心形_python绘制心形图像-Go语言中文社区

    一.打印心形 print('n'.join([''.join([('Lovezhuzhu'[(x-y)%8]if((x*0.05)**2+(y*0.1)**2-1)**3-(x*0.05)**2*(y ...

  8. 怎么用python编写心形图案,python编程爱心形状turtle

    如何利用python画一个爱心 1 from turtle import * 2 def curvemove(): #这个函数是为了绘制爱心上方的曲线 3 for i in range(200): 4 ...

  9. 520表白季,教你用matlab画动态心形曲线图,可自动保存GIF格式图片,送给女朋友,她们一定会惊讶,赶紧收藏!!!

    昨天发表了一篇用python教你画心形图表白的文章: 想要表白的看这里,教你用python画不同类型的心形图虏获芳心,值得收藏!! 里面详细介绍了各种心形图的画法以及最终的表白神器,值得点赞收藏!! ...

最新文章

  1. 什么是Code Review 代码审查
  2. Hadoop工具如何形成SAP Hana的大数据平台
  3. 用java设计节拍器_具有高速的Java节拍器
  4. curl 增加header_libcurl增加HTTP header 和 POST之后获取返回数据
  5. 【英语学习】【English L06】U07 Jobs L5 Work overtime
  6. (03)Verilog HDL模块例化
  7. 【设计模式】组合模式 Composite Pattern
  8. mysql的root用户无法给普通用户授权问题处理
  9. 学术资源不定期分享-【钱学森《工程控制论》英文原版】
  10. 柴静调查:穹顶之下_调查:HTML5数据列表
  11. 随机向量x的协方差阵_统计不相关:两个随机向量x(?)与y(?)统计不相关,若它们的互协方差矩阵不等于零矩阵,即Cxy = O。...
  12. EXCEL清除全表格式
  13. C语言无符号与有符号之间的比较
  14. 开始使用Elasticsearch (2): 了解如何进行搜索
  15. Python有什么用?Python 的 10 个实际用途
  16. python函数可以改变哪种数据类型的实参_Python函数参数的几种类型
  17. 教程丨使用MeterSphere进行场景化的接口测试
  18. 寄快递自定义短信通知教程
  19. 压力测试工具Jmeter的简单使用
  20. service mysql restart 和service mysqld restart 的区别

热门文章

  1. 《如何搭建小微企业风控模型》第十三节 额度公式 节选
  2. 智慧零售erp通用版管理系统+门店管理+商品管理+厂商管理+财务管理+销售管理+仓储管理+Axure高保真交互ERP通用版零售行业web端简易版管理系统
  3. Axure智慧、智能乡镇通数字管理服务平台+基础数据管理+招商后台管理+web端高保真管理后台
  4. mysql lost connection to server during query
  5. javascript 中的深复制 和 其实现方法
  6. 首页 、引导页、版本
  7. 中小企业 IT 运维福利:快速构建 on-call 机制
  8. C++设计模式--观察员
  9. C#3.0中的新特性
  10. MySQL操作之条件,排序,分页,聚合函数,分组,连接,子查询,自连接查询总结...