打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Python实现酷炫的动态交互式数据可视化,附代码
userphoto

2023.11.10 浙江

关注
教程精选
2019-9-12 22:34

(关注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 imageio df = 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 initialisation fig = 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 axes ax.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.25
 for root, _, files in os.walk(input_folder):
 file_paths = [os.path.join(root, file) for file in files]
 #sorted by modified time
 file_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的结果相同。这种相同的机制可以应用于其他很多应用,就像:动画分布,轮廓和机器学习模型。

图1:PCA方差图

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

Celluloid

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

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

from celluloid import Camera import numpy as np import matplotlib.pyplot as plt fig, 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所示。

图 2:Celluloid例子

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 datetime
df = 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]找到。

图4:Plotly例子

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, Legend
df = 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 = t
p.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 args
 cline.visible = false; 
 dline.visible = false;
 // cb_obj is injected in thanks to the callback
 if (cb_obj.active.includes(0)){aline.visible = true;} 
 // 0 index box is aline
 if (cb_obj.active.includes(1)){bline.visible = true;} 
 // 1 index box is bline
 if (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展示了结果图

图5:Bokeh 演示

如上面的代码展示的,这个图还可以另存为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:

图6 Seaborn 矩阵图

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 nbi
def cars(name, number):
 return '{} has {} cars!'.format(name, number)
 
interact(cars, name='Nemo', number={'Zero': 0, 'Two': 2, 
 'Three': 3, 'Ten': 10});

图7:NB互动实例

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---------------------------

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
在 Python 中可视化数据:Python 顶级库的深入比较
【Python实战】无监督学习—聚类、层次聚类、t-SNE,DBSCAN
桑基图或许可以告诉你打工人的故事!
制作交互式数据可视化图表,只需要一个Python库就能实现
6 种在 Python 中创建相关系数矩阵的方法
【技能】R语言进行交互数据可视化
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服