作者 | 阳哥
出品 | Python数据之道 (ID:PyDataLab)
大家好,我是阳哥。今天跟大家分享的是 Plotly Express 的详细使用教程。
Plotly Express 是 Python 交互式可视化库 Plotly 的高级组件,受 Seaborn 和 ggplot2 的启发,它专门设计为具有简洁,一致且易于学习的 API :只需一次导入,您就可以在一个函数调用中创建丰富的交互式绘图,包括分面绘图(faceting)、地图、动画和趋势线等。
使用 Plotly Express 可以轻松地进行数据可视化,一旦导入Plotly Express(通常简称 px
),大多数绘图只需要一个函数调用,接受一个整洁的 Pandas dataframe,并简单描述你想要制作的图。如果你想要一个基本的散点图,它只是px.scatter(dataframe,x =“column_name”,y =“column_name”)
。
Plotly Express 语法简洁,同时功能强大,可以绘制咱们遇到的大部分图表类型,比如线形图、散点图、柱状图、面积图、树形图、旭日图、甘特图等,本文将从如下20个方面,详细介绍 Plotly Express 的使用,看完内容介绍后,相应你也会喜欢上这个工具的。
![](https://i-blog.csdnimg.cn/blog_migrate/350f7b61f7b9ae0876914c1b94e433e9.jpeg)
部分动态图如下:
![](https://i-blog.csdnimg.cn/blog_migrate/8a0fb24a62a902d18f8a1774d5dfb382.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0f41a5f16c93aefd80d47f4d505c39dd.gif)
Plotly 以及 Plotly Express 是交互式可视化工具,阳哥录制了一段简短的视频,来展示下其强大与优雅之处。(建议将视频最大化后横屏浏览)
00 环境与数据准备
环境准备
现在 Plotly Express 不需要单独安装,它是包含在 Plotly 中的,用 pip install plotly
命令可以安装 Plotly,如果你用的是 Anaconda,也可以用 conda install plotly
命令来安装,然后导入如下:
import plotly.express as px
本文中,还用到 Pandas 等工具,完整的导入如下:
import plotly.express as px
import plotly.io as pio
import plotly.graph_objects as go
import pandas as pd
本文代码测试的时候,使用的环境如下:
Mac系统
Jupyter Notebook
Python版本为 v3.8
Plotly version: 5.1.0
Pandas version: 1.3.0rc1
数据准备
本文涉及的图形种类比较多,原本阳哥想用一份数据来覆盖这些图形的,后来发现不太现实,因此使用了多份数据。
对于大部分图形,阳哥在文中使用的是 covid-19
的数据,此外,还使用了跟股票投资相关的一些数据。
这里,先介绍下 covid-19
相关的数据。
我们需要读取并整理出需要的DataFrame,以便在后续可视化时使用。
分为三个小的步骤
(a) 读取数据及调整格式
data = pd.read_csv('./data/covid-19.csv',parse_dates=['date'],index_col=0)
# 将数据复制一份
df_all = data.copy()
# 将时间格式转为字符串格式的日期,以 YYYY-mm-dd 的形式保存
df_all['dates'] = df_all['date'].apply(lambda x:x.strftime('%Y-%m-%d'))
# 添加现存确诊列
df_all['current'] = df_all['confirmed'] - df_all['cured'] - df_all['dead']
df_all.fillna('', inplace=True)
print(df_all.info())
df_all
(b) 获取全球的数据
# 国内总计数量
df_cn = df_all.query("country=='中国' and province==''")
df_cn = df_cn.sort_values('date',ascending=False)
# 国外,按国家统计
df_oversea = df_all.query("country!='中国'")
df_oversea = df_oversea.fillna(value="")
df_oversea = df_oversea.sort_values('date',ascending=False)
df_global = df_cn.append(df_oversea)
df_global = df_global.sort_values(['country','date'])
df_global
![](https://i-blog.csdnimg.cn/blog_migrate/0b18997c5dcccdbde7c4142a65936bca.jpeg)
(c) 更新全球的数据
countries_all = list(df_global['country'].unique())
df_global_new = pd.DataFrame()
for item in countries_all:
df_item = df_global.query('country==@item')
df_i = df_item.copy(deep=False)
df_i['new-confirmed'] = df_i['confirmed'].diff()
df_i['new-cured'] = df_i['cured'].diff()
df_global_new = df_global_new.append(df_i)
df_global_new = df_global_new.dropna()
df_global_new
![](https://i-blog.csdnimg.cn/blog_migrate/16a15dbdf5d422a18797b2af4a06f975.jpeg)
这两个 DataFrame:df_global
和 df_global_new
我们会在后续可视化时多次用到。
说明:
文中使用的数据文件,在文末提供获取方式。
01 线形图(Line)
线形图是所有可视化工具中最常见的图表之一,在 px 中,用 px.line()
来进行可视化。
单条曲线
def plot_line():
df = df_global.groupby('date')[['confirmed','current','cured','dead']].sum()
df['new-confirmed'] = df['confirmed'].diff()
df = df.dropna()
df = df.sort_index().loc['20200122':,:]
fig = px.line(df,x=df.index,y='confirmed')
return fig
fig = plot_line()
# fig.write_image('./images/px/01-line-1.png')
fig.show()
![](https://i-blog.csdnimg.cn/blog_migrate/afc4ce5564999334b241aa6a07deae79.jpeg)
代码函数说明:
需要说明的是,在最简洁的情况下,绘制线形图只需要用 px.line(df,x =“column_name”,y =“column_name”)
来绘制即可,比如上面示例中的 px.line(df,x=df.index,y='confirmed')
由于本文涉及可视化图表比较多,需要调整的DataFrame也比较多,因此,阳哥一般以自定义函数的形式进行封装,这样显得逻辑要清楚些。
实际上, Plotly Express 默认的可视化,一般就是一行代码,这点咱们需要在脑海里有个印象。
同时,在本文后续的图表可视化中,也是以这种形式进行的。
图片保存
在使用 Plotly 绘制图片时,是可以将静态图片保存下来的,具体方法请前往下面的链接查看:
多条曲线绘制
在 Plotly v4.8 版本以后,支持同时绘制多条曲线,其语法格式为 px.line(df,x =“column_name”,y =[“column_name_1”,“column_name_2”,“column_name_3”,……])
示例如下:
def plot_line_multi():
df = df_global.groupby('date')[['confirmed','current','cured','dead']].sum()
df['new-confirmed'] = df['confirmed'].diff()
df = df.dropna()
df = df.sort_index().loc['20200122':,:]
fig = px.line(df,x=df.index,y=['confirmed','current','dead'])
return fig
fig = plot_line_multi()
# fig.write_image('./images/px/01-line-2.png')
fig.show()
![](https://i-blog.csdnimg.cn/blog_migrate/f0821a07521badca92e2018764d16e09.jpeg)
分列绘制曲线
Plotly Express 支持绘制分列或行的曲线图,通过设置参数 facet_row
或 facet_col
来实现,示例如下:
# 绘制分列或行的曲线图
def plot_line_facet():
df = df_global_new.set_index('date').loc['20201204':'20201208',:]
countries_list = ['美国','印度','俄罗斯','巴西','法国']
df = df[df['country'].isin(countries_list)]
fig = px.line(df,
x=df.index,
y='new-confirmed',
color='country',
line_group='country',
facet_col='country',
# log_y=True,
)
fig.update_traces(mode='markers+lines')
return fig
fig = plot_line_facet()
# fig.write_image('./images/px/01-line-3.png')
fig.show()
![](https://i-blog.csdnimg.cn/blog_migrate/cb4491f4e8e13e2c03b6ec1c8a574c6b.jpeg)
在 Plotly Express 中,不止 px.line()
支持参数 facet_row
或 facet_col
,还有其他一些图形也是支持的,比如散点图、柱状图等,大家可以在 Jupyter Notebook 中查看其是否有这两个参数:
![](https://i-blog.csdnimg.cn/blog_migrate/4c804c07c73f0d7952dff8b7ef66794c.jpeg)
02 面积图(Area)
面积图,跟线形图有点类似,曲线下带阴影面积,因此称之为面积图。
Plotly Express 中通过 px.area()
来实现,示例如下:
# 绘制填充的面积曲线图
def plot_area():
df = df_global_new.set_index('date').loc['20200904':'20201208',:]
countries_list = ['美国','印度','俄罗斯','巴西','法国']
df = df[df['country'].isin(countries_list)]
fig = px.area(df,
x=df.index,
y='confirmed',
color='country',
line_group='country'
)
return fig
fig = plot_area()
# fig.write_image('./images/px/02-area-1.png')
fig.show()
![](https://i-blog.csdnimg.cn/blog_migrate/6dd8ac47652939ba62377403a21c5bda.jpeg)
03 散点图(Scatter)
散点图,也是咱们常用的图形之一,Plotly Express 中通过 px.scatter()
来实现,示例如下:
def plot_scatter_line():
df = df_global.groupby('date')[['confirmed','current','cured','dead']].sum()
df['new-confirmed'] = df['confirmed'].diff()
df = df.dropna()
df = df.sort_index().loc['20200122':,:]
fig = px.scatter(df,x='confirmed',y='dead')
return fig
fig = plot_scatter_line()
# fig.write_image('./images/px/03-sactter-1.png')
fig.show()
![](https://i-blog.csdnimg.cn/blog_migrate/cdbdcc67dc8fea6bc258baf7e016cb1e.jpeg)
上面这张图,初看起来,跟线形图有点类似,实际它是散点图,只是点比较密集。
再来看一个示例,对全球多个国家的数据进行可视化后,散点分布就明显了:
def plot_scatter():
df = df_global_new.set_index('date').loc['20201208':'20201208']
df = df.sort_values('confirmed',ascending=False).head(30)
fig = px.scatter(df,x='confirmed',y='dead',
color='country',size='confirmed'
)
return fig
fig = plot_scatter()
# fig.write_image('./images/px/03-sactter-2.png')
fig.show()
![](https://i-blog.csdnimg.cn/blog_migrate/c96b2c0295be2152ff256c6ad0ca1652.jpeg)
散点矩阵图
在 Plotly Express 中,针对散点矩阵图,专门有一个API来实现 px.scatter_matrix()
,示例如下:
def plot_scatter_matrix():
df = df_global_new.set_inde