栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

【Python百日基础系列】Day19 - Pandas 数据可视化(1)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Python百日基础系列】Day19 - Pandas 数据可视化(1)

文章目录
  • 一、 环境与数据准备
    • 1.1 环境准备
    • 1.2 数据准备
  • 二、 线形图(Line)
    • 2.1 单条曲线
    • 2.2 多条曲线绘制
    • 2.3 分列绘制曲线
  • 三、面积图(Area)
  • 四、散点图(Scatter)
    • 4.1 密集数据散点图
    • 4.2 全球多个国家
    • 4.3 散点矩阵图
  • 五、饼图(Pie)
    • 5.1 饼图(Pie)
    • 5.2 环形图
  • 六、柱状图(Bar)
    • 6.1 垂直柱状图
    • 6.2 水平柱状图
    • 6.3 对数坐标
    • 6.4 堆积柱状图
    • 6.5 分组的柱状图
    • 6.6 样式形状
  • 七、箱形图(Box)
    • 7.1 垂直箱形图
    • 7.2 水平箱形图
  • 八、小提琴图(Violin)
    • 8.1 小提琴图
    • 8.2 显示箱体的小提琴图
    • 8.3 显示箱体及分位数值的小提琴图
    • 8.4 水平的小提琴图
  • 九、密度图

视频讲解:

【Python百日基础系列】Pandas 数据可视化(1)


我是阳哥的搬运工,从PDF到网页,从 junpyter notebook 到 pycharm
更多精彩内容请扫描上方二维码,关注阳哥的“Python数据之道”或者阳哥的网站:http://liyangbit.com/添加链接描述。

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 的使用,看完内容介绍后,相应你也会喜欢上这个工具的。

一、 环境与数据准备 1.1 环境准备

现在 Plotly Express 不需要单独安装,它是包含在 Plotly 中的,用pip install plotly命令可以安装Plotly。

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pandas
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple plotly
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple kaleido	# 保存图片
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple mkl
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple  scikit_image # 加载图片

如果你用的是 Anaconda,也可以用conda install plotly命令来安装,然后导入。本文中,还用到 Pandas 等工具,完整的导入如下:

import plotly
import plotly.express as px
import plotly.io as pio
import plotly.graph_objects as go
import pandas as pd

# pd.set_option('display.max_rows', None)		#显示所有行
pd.set_option('display.max_columns', None) 	#显示所有列
pd.set_option('max_colwidth', None)			# 显示列中单独元素的最大长度
pd.set_option('expand_frame_repr',False) 	# True表示列可以换行显示。设置成False的时候不允许换行显示;
pd.set_option('display.width', 80) 			#横向最多显示多少个字符;
1.2 数据准备

本文涉及的图形种类比较多,先介绍下covid-19相关的数据。我们需要读取并整理出需要的 Dataframe,以便在后续可视化时使用。分为三个小的步骤:
(a) 读取数据及调整格式

print(os.getcwd())  # E:python_studyenv_study

# 读取数据及调整格式
data = pd.read_csv('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['/confirm/ied'] - df_all['cured'] - df_all['dead']
df_all.fillna('', inplace=True)
print(df_all.info())
print(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'])
print(df_global	)

© 更新全球的数据

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-/confirm/ied'] = df_i['/confirm/ied'].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()
print(df_global_new)

这两个 Dataframe:df_global和df_global_new我们会在后续可视化时多次用到。

二、 线形图(Line)

线形图是所有可视化工具中最常见的图表之一,在 px 中,用px.line()来进行可视化。

2.1 单条曲线
# 2.1 单条曲线
def plot_line():
    df = df_global.groupby('date')[['/confirm/ied','current','cured','dead']].sum()
    df['new-/confirm/ied'] = df['/confirm/ied'].diff()
    df = df.dropna()
    df = df.sort_index().loc['20200122':,:]
    fig = px.line(df,x=df.index,y='/confirm/ied')
    return fig

fig = plot_line()
# 保存为图片
fig.write_image('./images/px/01-line-1.png')
# jupyter notebook中显示
fig.show()
# 默认浏览器中显示
plotly.offline.plot(fig)

代码函数说明:
需要说明的是,在最简洁的情况下,绘制线形图只需要用px.line(df,x =“column_name”,y =“ column_name”)来绘制即可,比如上面示例中的px.line(df,x=df.index,y=‘/confirm/ied’)
由于本文涉及可视化图表比较多,需要调整的 Dataframe 也比较多,因此,一般以自定义函数的形式进行封装,这样显得逻辑要清楚些。
实际上,Plotly Express 默认的可视化,一般就是一行代码,这点咱们需要在脑海里有个印象。
plotly可以以三种方式展示绘图效果:

  • jupyter notebook展示,有交互效果

  • 保存的静态图片,没有交互效果。

  • 浏览器中显示有交互效果。

2.2 多条曲线绘制
# 2.2 多条曲线绘制
"""在 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')[['/confirm/ied','current','cured','dead']].sum ()
    df['new-/confirm/ied'] = df['/confirm/ied'].diff()
    df = df.dropna()
    df = df.sort_index().loc['20200122':,:]
    fig = px.line(df,x=df.index,y=['/confirm/ied','current','dead'])
    return fig

fig = plot_line_multi()
fig.write_image('./images/px/01-line-2.png')
# fig.show()

2.3 分列绘制曲线
# 2.3 分列绘制曲线
"""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-/confirm/ied',
                color='country',
                line_group='country',
                facet_col='country',
                )
    fig.update_traces(mode='markers+lines')
    return fig
fig = plot_line_facet()
fig.write_image('./images/px/01-line-3.png')
# fig.show()


在 Plotly Express 中,不止px.line()支持参数facet_row或facet_col,还有其他一些图形也是支持的,比如散点图、柱状图等,可以查看源码中是否包含facet_row=None和facet_col=None。

三、面积图(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='/confirm/ied',
            color='country',
            line_group='country')
    return fig
fig = plot_area()
# fig.write_image('./images/px/02-area-1.png')
# fig.show()
plotly.offline.plot(fig)

四、散点图(Scatter) 4.1 密集数据散点图
# 散点图(Scatter)
"""散点图,也是咱们常用的图形之一,Plotly Express 中通过px.scatter()来实现"""
def plot_scatter_line():
    df = df_global.groupby('date')[['/confirm/ied','current','cured','dead']].sum()
    df['new-/confirm/ied'] = df['/confirm/ied'].diff()
    df = df.dropna()
    df = df.sort_index().loc['20200122':,:]
    fig = px.scatter(df,x='/confirm/ied',y='dead')
    return fig
fig = plot_scatter_line()
fig.write_image('./images/px/03-sactter-1.png')
# fig.show()
plotly.offline.plot(fig)


上面这张图,初看起来,跟线形图有点类似,实际它是散点图,只是点比较密集,局部放大后。

4.2 全球多个国家
# 对全球多个国家的数据进行可视化后,散点分布就明显了:
def plot_scatter():
    df = df_global_new.set_index('date').loc['20201208':'20201208']
    df = df.sort_values('/confirm/ied',ascending=False).head(30)
    fig = px.scatter(df,
            x='/confirm/ied',
            y='dead',
            color='country',
            size='/confirm/ied'
            )
    return fig

fig = plot_scatter()
fig.write_image('./images/px/03-sactter-2.png')
# fig.show()
plotly.offline.plot(fig)

对全球多个国家的数据进行可视化后,散点分布就明显了:

4.3 散点矩阵图
# 散点矩阵图在 Plotly Express 中,针对散点矩阵图,专门有一个 API 来实现px.scatter_matrix():
def plot_scatter_matrix():
    df = df_global_new.set_index('date').loc['20201208':'20201208']
    df = df.sort_values('/confirm/ied',ascending=False).head(30)
    fig = px.scatter_matrix(df,
                dimensions=['/confirm/ied','cured','dead'],
                color='country',
                size='/confirm/ied'
                )
    return fig

fig = plot_scatter_matrix()
fig.write_image('./images/px/03-sactter-3.png')
# fig.show()
plotly.offline.plot(fig)

五、饼图(Pie) 5.1 饼图(Pie)
# 饼图(Pie)绘制饼图时,用的是跟股票投资相关的数据,在 Plotly Express 中,通过px.pie()来进行饼图的可视化
df_invest = pd.read_csv('sunburst.csv')
fig = px.pie(df_invest,values='持有市值',names='指数名称')
fig.update_traces(textposition='inside',
                textinfo='percent+label'
                )
fig.write_image('./images/px/04-pie-1.png')
# fig.show()
plotly.offline.plot(fig)

5.2 环形图
# 环形图 通过设置参数hole,还可以将饼图变为环形图
fig = px.pie(df_invest,
            values='持有市值',
            names='指数名称',
            hole=0.6
            )
fig.update_traces(textposition='inside',
            textinfo='percent+label'
            )
fig.write_image('./images/px/04-pie-2.png')
# fig.show()
plotly.offline.plot(fig)

六、柱状图(Bar)

柱状图,是数据可视化中必不可少的基础图形,在 Plotly Express 中,通过px.bar()来实现。

6.1 垂直柱状图
# 垂直柱状图  默认情况下,px.bar()绘制的是垂直柱状图
def plot_bar():
    df = df_global_new.set_index('date').loc['20201208':'20201208']
    df = df.sort_values('/confirm/ied',ascending=False).head(30)
    fig = px.bar(df,
            x='country',
            y='/confirm/ied',
            color='country')
    return fig
fig = plot_bar()
fig.write_image('./images/px/05-bar-1.png')
# fig.show()
plotly.offline.plot(fig)

6.2 水平柱状图
# 水平柱状图  通过设置参数orientation的值,可以绘制水平柱状图
def plot_bar_h():
    df = df_global_new.set_index('date').loc['20201208':'20201208']
    df = df.sort_values('/confirm/ied',ascending=False).head(30)
    fig = px.bar(df,
                x='/confirm/ied',
                y='country',
                color='country',
                orientation='h'
                )
    return fig
fig = plot_bar_h()
fig.write_image('./images/px/05-bar-2.png')
# fig.show()
plotly.offline.plot(fig)

6.3 对数坐标
# 对数坐标  上面的水平柱状图,由于最大的数值和最小的数值差异比较大,用数据绝对值进行可视化时,图表的展示效果可能不是太好,这个时候,可以考虑用对数坐标来展示,通过设置参数log_x或log_y来实现
def plot_bar_log():
    df = df_global_new.set_index('date').loc['20201208':'20201208']
    df = df.sort_values('/confirm/ied',ascending=False).head(30)
    fig = px.bar(df,
            x='/confirm/ied',
            y='country',
            color='country',
            orientation='h',
            log_x=True # log_x 对数坐标
            )
    return fig
fig = plot_bar_log()
fig.write_image('./images/px/05-bar-3.png')
# fig.show()
plotly.offline.plot(fig)

6.4 堆积柱状图
# 堆积柱状图 柱状图的展现方式:当同一系列中有不同的类型时,绘制柱状图的时候,通常有堆积和分组两种展示形式,默认情况下,是堆积柱状图
def plot_bar_stack():
    df = df_global_new.set_index('date').loc['20201201':'20201208',:]
    countries_list = ['美国','印度','俄罗斯','巴西','法国']
    df = df[df['country'].isin(countries_list)]
    fig = px.bar(df,
            x=df.index,
            y='/confirm/ied',
            color='country'
            )
    return fig
fig = plot_bar_stack()
fig.write_image('./images/px/05-bar-4.png')
# fig.show()
plotly.offline.plot(fig)

6.5 分组的柱状图
# 分组的柱状图  通过设置参数barmode="group"可以转变为分组的柱状图
def plot_bar_group():
    df = df_global_new.set_index('date').loc['20201201':'20201208',:]
    countries_list = ['美国','印度','俄罗斯','巴西','法国']
    df = df[df['country'].isin(countries_list)]
    fig = px.bar(df,
                x=df.index,
                y='/confirm/ied',
                color='country',
                barmode='group'
                )
    return fig

fig = plot_bar_group()
fig.write_image('./images/px/05-bar-6.png')
# fig.show()
plotly.offline.plot(fig)

6.6 样式形状
# 样式形状  在 Plotly 5.1 版本中,还支持设置样式形状,有两个相关的参数,pattern_shape 和 patter_shape_sequence
def plot_bar_shape():
    df = df_global_new.set_index('date').loc['20201201':'20201208',:]
    countries_list = ['美国','印度','俄罗斯','巴西','法国']
    df = df[df['country'].isin(countries_list)]
    fig = px.bar(df,
                x=df.index,	
                y='/confirm/ied',	
                color='country',	
                pattern_shape="country",	
                pattern_shape_sequence=[".", "x", "+",'/','\'],
                )	
    return fig	
fig = plot_bar_shape()	
fig.write_image('./images/px/05-bar-5.png')	
# fig.show()	
plotly.offline.plot(fig)

七、箱形图(Box)

又称为盒须图、盒式图或箱线图,是一种用作显示一组数据分散情况资料的统计图,因形状如箱子而得名。
它能显示出一组数据的最大值、最小值、中位数、及上下四分位数。
在股票以及指数基金投资时,喜欢用箱形图来对标的的估值分布情况进行可视化,效果如下:

7.1 垂直箱形图
# 垂直箱形图(Box)  针对 ETF 的累计净值数据绘制箱形图,通过px.box()来实现,
df3 = pd.read_csv('data_etf.csv', parse_dates=['净值日期'])
df3['code'] = df3['code'].astype(str)
fig = px.box(df3,
            x='code',	
            y='累计净值',	
            color='code'
            )
fig.write_image('./images/px/06-box-1.png')
# fig.show()
plotly.offline.plot(fig)

7.2 水平箱形图
# 水平箱形图 通过设置参数orientation的值
fig = px.box(df3,
        x='累计净值',
        y='code',color='code',
        orientation='h')
fig.write_image('./images/px/06-box-3.png')
# fig.show()
plotly.offline.plot(fig)

八、小提琴图(Violin)

小提琴图 (Violin Plot) 是用来展示多组数据的分布状态以及概率密度。这种图表结合了箱形图和密度图的特征,主要用来显示数据的分布形状。跟箱形图类似,但是在密度层面展示更好。在数据量非常大不方便一个一个展示的时候小提琴图特别适用。Plotly Express 中通过px.violin()来实现。

8.1 小提琴图
# 小提琴图(Violin)
fig = px.violin(df3,
        x='code',
        y='累计净值',
        color='code')
fig.write_image('./images/px/07-violin-1.png')
# fig.show()
plotly.offline.plot(fig)

8.2 显示箱体的小提琴图
# 显示箱体的小提琴图  可以通过设置参数box=True来显示箱体
fig = px.violin(df3,
        x='code',
        y='累计净值',
        color='code',
        box=True)
fig.write_image('./images/px/07-violin-2.png')
# fig.show()
plotly.offline.plot(fig)

8.3 显示箱体及分位数值的小提琴图
# 显示箱体及分位数值的小提琴图   通过设置参数points='all',可以在小提琴图旁边展示数据的密度分布情况
fig = px.violin(df3,
        x='code',
        y='累计净值',
        color='code',
        box=True,
        points='all')
fig.write_image('./images/px/07-violin-3.png')
# fig.show()
plotly.offline.plot(fig)

8.4 水平的小提琴图
# 水平的小提琴图,通过设置参数orientation='h'
fig = px.violin(df3,
            x='累计净值',
            y='code',
            color='code',
            box=True,
            points='all',
            orientation='h'
            )
fig.write_image('./images/px/07-violin-4.png')
# fig.show()
plotly.offline.plot(fig)

九、密度图
# 密度图
fig = px.strip(df3,
        y='code',
        x='累计净值')
fig.write_image('./images/px/07-violin-5.png')
# fig.show()
plotly.offline.plot(fig)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/445407.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号