1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 高级可视化神器Plotly快速入门

高级可视化神器Plotly快速入门

时间:2024-02-09 10:31:16

相关推荐

高级可视化神器Plotly快速入门

微信公众号:尤而小屋

作者:Peter

编辑:Peter

一文爱上高级可视化神器Plotly

数据可视化已经逐渐发展和深入到我们生活的各个方面,往往遇到数据分析类的工作,借助可视化的方式来呈现我们的数据和结论,能够帮助我们更好地理解数据本身的含义和背后隐藏的规律。

数据通常是以图形或者图表的形式进行展示,例如Excel表格、柱状图、折线图、饼图、旭日图等。

现在出现了很多可视化的工具能够实现数据图表的可视化展示,比如Tableau、Power BI等;和python相关的第三方可视化库也数不胜数,比如很传统和基础的matplotlib、pyecharts、Seaborn,还比如D3、Highcharts等。它们有着自己或多或少的使用缺陷:

绘制出来的图形是静态的:无法实现动态可视化部分软件需要付费才能使用;否则只能使用部分基础功能有些可视化库涉及到很多前端JavaScript、HTML的知识,上手比较困难配置麻烦:简单的图形也需要大量的代码进行配置

Plotly简介

Plotly是一款用来做数据分析和可视化的在线平台,功能真的是非常强大,它主要有以下特点:

图形多样化:在线绘制多种图形,比如柱状图、饼图、直方图、饼图、气泡图、桑基图、股票图、旭日图、联合分布图、地图等在线可编辑:Plotly中有在线编辑的平台,可以将生成的图形保存到该平台,并进行分享开源免费:Plotly的所有资源都是开源免费的,用户可直接使用,还可以直接和R、python、MATLAB等软件或者语言无缝对接图形动态化:Plotly生成的图形全部是动态化;Plotly的绘图最好在Jupyter notebook中进行,能够很好地显示动态效果颜色绚丽:在使用Plotly绘制图形的时候,我们可以进行图形颜色的设置,Plotly提供了丰富的颜色面板供选择代码量少:Plotly绘图,尤其是Plotly的高级封装Plotly_Express,代码量非常少;一行代码就能实现多种功能且精美的图形内置丰富数据集:在Plotly中内置7个不同类型的数据集,方便读者直接使用内置数据进行学习、使用文档健全:Plotly官方提供了丰富的文档资料和案例可免费学习,能够快速的上手

附录:在官网中展示了Plotly能够绘制的部分图形:/python/

安装和使用

可视化库Plotly及子库的安装非常简单,只需要通过两条命令:

pip install plotlypip install plotly_express # 安装

使用之前先导入:

# 两种绘图接口import plotly_express as px # import plotly.express as pximport plotly.graph_objects as go

上面介绍了两种Plotly中绘图的接口:

plotly_express:通常是简写为pxplotly.graph_objects:通常简写为go

内置数据集

在Plotly中内置了非常多的数据集,当我们导入了之后可以直接使用:

1、内置GDP数据集

gapminder = px.data.gapminder() gapminder.head() # 查看前5行数据

2、餐厅消费的数据集

tips = px.data.tips() tips.head()

3、数据领域非常著名的鸢尾花数据集

iris = px.data.iris() iris.head()

4、一份风力数据集

wind = px.data.wind() wind.head()

5、选举结果数据集

election = px.data.election() election.head() # 显示前5行数据

上面只列出了Plotly中的部分数据集,下面的导图记录了全部的内置数据作用及其相应的字段,可供用户免费使用,非常友好:

Plotly绘图

上面介绍了可视化和Plotly的相关知识,下面将通过各种实际的案例来讲解如何利用Plotly绘制相关的可视化图形。

所有的图像在Jupyter notebook中都是动态可视化,本文采取的是截图方式来展示可视化结果。

基础散点图

1、绘制基础的散点图,如果是直接传入两个轴的数据,需要2个参数:

fig = px.scatter( # scatter绘制散点图x=[0,2,4,6], # x轴y=[1,3,5,7] # y轴)fig.show()

2、如果是使用pandas中的数据库DataFrame来绘制图像:

df = px.data.iris() # 鸢尾花数据集df.head()

fig = px.scatter(df, # 数据集x="sepal_width", # x轴y="sepal_length" # y轴)fig.show()

3、还可以传入一个颜色参数color,可以选择字符型或者数据型:

字符型数据

fig = px.scatter(df, # 数据集x="sepal_width", # x轴y="sepal_length", # y轴color="species", # 指定颜色:字符型数据)fig.show()

数值型数据

fig = px.scatter(df, # 数据集x="sepal_width", # x轴y="sepal_length", # y轴color="sepal_length" # 指定颜色)fig.show()

4、传入size参数控制每个点的大小,相当于是在制作气泡图

gap = px.data.gapminder().query("year == 2002")fig = px.scatter(gap # 绘图数据,x="gdpPercap" # x轴,y="lifeExp" # y轴,color="continent" # 颜色参数,size="pop" # 点的大小,size_max=60 # 点的最大值)fig.show()

5、散点图中显示每个点的数据

x_data = [0,2,4,6,8]y_data = [1,3,5,7,9]fig = px.scatter(x=x_data,y=y_data,color=x_data, # 颜色设置text=x_data # 显示内容)fig.update_traces(textposition="top center") # 显示位置:顶部居中fig.show()

6、绘制折线图:折线图可以理解成散点图的一种极限形式,下面例子中使用go方法实现

import plotly.graph_objects as goimport numpy as npnp.random.seed(1)# 生成随机数据N = 200random_x = np.linspace(0, 1, N)random_y0 = np.random.randn(N) + 10random_y1 = np.random.randn(N)random_y2 = np.random.randn(N) - 10# 准备画布fig = go.Figure()# 添加3组不同的数据fig.add_trace(go.Scatter( # x=random_x, y=random_y0,mode='lines', # mode模式 name='lines')) # 名字fig.add_trace(go.Scatter(x=random_x, y=random_y1, mode='lines+markers', name='lines+markers'))fig.add_trace(go.Scatter(x=random_x, y=random_y2, mode='markers',name='markers'))fig.show()

7、绘制3D散点图

import plotly.express as pxdf = px.data.iris()fig = px.scatter_3d(df, # 指定数据x='sepal_length', # 指定xyzy='sepal_width', z='petal_width',color='species') # 指定颜色fig1.show()

绘制柱状图

1、基础柱状图

自行模拟一份数据集:

df1 = pd.DataFrame({"name": ["小明","小红","周明","周红","张三"],"age": [20,28,18,25,36],"score": ["150","170","160","168","154"]})df1

fig = px.bar(df1, # 绘图数据x="name", # x轴y="age" # y轴)fig.show()

2、加上改变颜色的参数color

fig = px.bar(df1,x="name",y="age",color="age" # 颜色参数)fig.show()

3、设置图中的悬停信息

悬停信息指的是:当我们光标放到图形上去才会显示的信息

第一种是基于px方法实现的悬停信息:

fig = px.bar(df1,x="name",y="age",color="age", # 加上颜色参数hover_data = ['score'] # 悬停参数)fig.show()

第二种是基于go方法实现的悬停信息:

import plotly.graph_objects as goname = ['Product A', 'Product B', 'Product C']number = [1200, 1500, 1300]fig = go.Figure(data=[go.Bar(x=name, y=number,hovertext=['20% 市场份额 ', '50% 市场份额', '30% 市场份额'])])fig.update_traces(marker_color='rgb(15,110,225)', # marker颜色marker_line_color='rgb(108,48,107)', # 线条颜色marker_line_width=1.5, # 线宽opacity=0.6) # 透明度fig.update_layout(title_text='3种产品市场份额对比')fig.show()

4、x轴标签倾斜设置

模拟一份新的数据:

information = pd.DataFrame({"days":["3月1日 星期一","3月2日 星期二","3月3日 星期三","3月4日 星期四","3月5日 星期五"],"number":[400,700,300,500,800]})information

默认情况下x轴标签是水平显示:

fig = px.bar(information,x="days",y="number")fig.show() # 默认水平显示

fig = px.bar(information,x="days",y="number")fig.update_layout(xaxis_tickangle=-45) # 倾斜角度设置fig.show() # 结果是向左倾斜

基于go方法实现的x轴标签倾斜:

import plotly.graph_objects as gomonths = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun','Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']# 生成画布对象fig = go.Figure() # 添加多个图形轨迹fig.add_trace(go.Bar(x=months,y=[20, 14, 25, 16, 18, 22, 19, 15, 12, 16, 14, 17],name='产品A',marker_color='lightblue' # 颜色的不同表示方法))fig.add_trace(go.Bar(x=months,y=[19, 14, 22, 14, 16, 19, 15, 14, 10, 12, 12, 16],name='产品B',marker_color='#af0110'))fig.update_layout(barmode='group', # 柱状图模式xaxis_tickangle=-45 # 倾斜角度)fig.show()

5、分组柱状图

第一种情况是基于长表形式的分组柱状图:

df2 = pd.DataFrame({"姓名": ["小明","小红","张三","小明","小红","张三","小明","小红","张三"],"科目":["语文","语文","语文","数学","数学","数学","英语","英语","英语"],"得分": [58,78,84,90,71,90,64,84,69]})df2

fig = px.bar(df2,x="姓名",y="得分",color="科目")fig.show()

第二种情况是基于宽表形式的分组柱状图:

df3 = pd.DataFrame({"姓名": ["小明","小红","张三"],"语文":[58,78,84],"数学":[90,71,90],"英语":[64,84,69]})df3

fig = px.bar(df3,x="姓名",y=["语文","数学","英语"],title="学生成绩对比" # 添加标题)fig.show()

6、多面柱状图

使用的是Plotly中自带的餐厅消费数据集:

fig = px.bar(df4, # 带绘图数据 x="sex", # x轴y="total_bill", # y轴color="smoker", # 颜色的设置barmode="group", # 柱状图4种模式之一facet_row="time", # 行facet_col="day", # 列category_orders={"day": ["Thur", "Fri", "Sat", "Sun"],"time": ["Lunch", "Dinner"] # 分类顺序设置})fig.show()

7、改变柱状图基准位置

import plotly.graph_objects as goyears = ['','','']fig = go.Figure()fig.add_trace(go.Bar(x=years, y=[2000, 3000, 5000],base=[-2000,-3000,-5000], # 基准位置设置marker_color='crimson',name='商家A'))fig.add_trace(go.Bar(x=years, y=[3000, 4000, 2000],base=0, # 默认的基准设置marker_color='lightslategrey',name='商家B'))fig.show()

8、改变图例位置和颜色

有时候我们需要改变图例的颜色和位置,进行如下设置:

import plotly.graph_objects as gosubjects = ["语文","数学","英语","物理","化学","生物"]fig = go.Figure()fig.add_trace(go.Bar(x=subjects, # x轴、y轴数据 y=[90,85,78,90,99,80],name='周均', # 图例名称 marker_color='rgb(15, 83, 109)' # 该组数据颜色))fig.add_trace(go.Bar(x=subjects,y=[80,89,68,100,78,90],name='小明',marker_color='rgb(180, 118, 255)'))fig.update_layout(title='期末成绩对比情况', # 整个图的标题xaxis_tickfont_size=12, # x轴字体大小yaxis=dict(title='成绩', # y轴的标题titlefont_size=16, # 标题大小tickfont_size=6, # y轴上的数值大小),legend=dict(x=0, # 图例的位置y=1,# bgcolor='rgba(255, 255, 255, 0)', # 图例的背景色bordercolor='rgba(112, 255, 255, 0)' # 边缘颜色),barmode='group', # 柱状图模式bargap=0.5, # 组间距离bargroupgap=0.4 # 组内距离)fig.show()

绘制水平柱状图

1、基于px实现水平柱状图,加上参数orientation=‘h’

df1 = pd.DataFrame({"name": ["小明","小红","周明","周红","张三"],"age": [20,28,18,25,36],"score": ["150","170","160","168","154"]})df1

fig = px.bar(df1,y="name", # xy轴的数据需要交换x="age",orientation='h', # 水平柱状图text="age" # 需要显示的数据)# 设置文本显示的位置,默认是里面# fig.update_traces(textposition="outside") # ['inside', 'outside', 'auto', 'none']fig.show()

2、改变柱状图颜色

第一种方法是使用颜色参数color

fig = px.bar(df1,y="name", x="age",color="age", # 颜色参数orientation='h', # 水平柱状图text="age" )fig.update_traces(textposition="outside") # ['inside', 'outside', 'auto', 'none']fig.show()

第二种情况是自定义颜色

fig = px.bar(df1,y="name", x="age",#color="age",# 自定义颜色color_discrete_sequence=px.colors.diverging.RdBu,orientation='h', # 水平柱状图text="age" )fig.update_traces(textposition="outside") # ['inside', 'outside', 'auto', 'none']fig.show()

3、基于go方法实现

fig = go.Figure(go.Bar(x=df1["score"].tolist(), # x轴数据y=df1["name"].tolist(), # y轴数据orientation='h'))fig.show()

4、分组水平柱状图

import plotly.graph_objects as go# 生成画布fig = go.Figure()# 添加3个图形轨迹fig.add_trace(go.Bar(y=['小明', '小红', '张三'],x=[120, 74, 103],name='语文',orientation='h',marker=dict(color='rgba(246, 78, 139, 0.6)',line=dict(color='rgba(246, 78, 139, 1.0)', width=3))))fig.add_trace(go.Bar(y=['小明', '小红', '张三'],x=[92, 128, 89],name='数学',orientation='h',marker=dict(color='rgba(5, 71, 80, 0.6)',line=dict(color='rgba(58, 71, 80, 1.0)', width=3))))fig.add_trace(go.Bar(y=['小明', '小红', '张三'],x=[92, 78, 69],name='英语',orientation='h',marker=dict(color='rgba(18, 7, 80, 0.6)',line=dict(color='rgba(58, 71, 80, 1.0)', width=3))))fig.update_layout(barmode='stack') # 堆叠模式:['stack', 'group', 'overlay', 'relative']fig.show()

绘制漏斗图

漏斗图在电商销售领域使用的非常普遍,它能够明显地观察到不同阶段之间的转化效果,下面通过不同的例子来讲解漏斗图的制作。

1、普通漏斗图

自行模拟一份数据:

data1 = pd.DataFrame({"number": [1200,900,700,400,180,100],"stage": ["浏览网站","搜索","加购","提交订单","点击支付","支付成功"]})data1

# 绘图fig = px.funnel(data1, # 绘图数据x="number", # x轴数据y="stage" # y轴数据)fig.show()

通过go方法来实现基础漏斗图:

from plotly import graph_objects as gofig = go.Figure(go.Funnel(x=[1000,800,400,100],y=["浏览网站","加购","点击支付","支付成功"]))fig.show()

还可以给漏斗图改变颜色,只需要加上颜色参数color

# 加上颜色参数colorfig = px.funnel(data1[::-1], # 数据翻转x="number",y="stage",color="stage" # 改成stage)fig.show()

2、分组漏斗组的展示

将不同组别的漏斗图放在一个大的画布中,我们生成3月份和3月份的数据,绘制分组漏斗图:

# 3月数据stage=["浏览网站","加购","点击支付","支付成功"]df1 = pd.DataFrame(dict(number=[1000,800,400,100],stages=stage))df1["time"] = "3月"df1

# 3月份stage=["浏览网站","加购","点击支付","支付成功"]df2 = pd.DataFrame(dict(number=[1200,600,300,140],stages=stage))df2["time"] = "3月"df2

上面生成了两个月份的不同数据,现在通过concat函数进行数据的合并:

# 将两组数据合并df3 = pd.concat([df1, df2], axis=0)df3

最后通过funnel()方法来绘图:

# 绘图fig = px.funnel(df3,x="number",y="stages",color="time")fig.show()

3、通过go方法来实现分组漏斗

from plotly import graph_objects as gostage = ["浏览网站","加购","点击支付","支付成功"]fig = go.Figure()fig.add_trace(go.Funnel(name = "3月", # 图形轨迹名称x = [1000,800,400,200], # 数据y = stage, # 每个阶段名称orientation = "h", # 方位textposition = "inside", # 文本内容的位置textinfo = "value+percent previous" # 显示文本内容))fig.add_trace(go.Funnel(name = "2月", # 名称和数据需要改变x = [1200,900,500,240], y = stage, orientation = "h", textposition = "inside", textinfo = "value+percent total" ))fig.add_trace(go.Funnel(name = "3月", # 名称和数据需要改变x = [1500,1000,450,300], y = stage, orientation = "h", textposition = "inside", textinfo = "label+percent initial" ))fig.show()

绘制饼图

饼图在可视化图表中是一种非常常见的图,它能够很好地展示不同组别的占比情况,下面通过具体的案例来绘制不同需求的饼图。

1、基础饼图的绘制

模拟一份水果店的进货数量的数据,如下表:

fruit = pd.DataFrame({"name":["苹果","香蕉","梨","菠萝","葡萄"],"number":[1000,800,600,2000,2500]})fruit

fig = px.pie(fruit, # 绘图数据names="name", # 显示的名称values="number" # 显示的数据)fig.show()

基于go方法实现基础饼图:

import plotly.graph_objects as goname=fruit["name"].tolist()value=fruit["number"].tolist() fig = go.Figure(data=[go.Pie(labels=name, # 标签values=value # 显示数据)])fig.show()

结果和上面的图形相同

2、给饼图添加标题,并改变位置

fig = px.pie(fruit,names="name",values="number")fig.update_layout(title={# 设置整个标题的名称和位置"text":"水果数量占比", # 标题"y":0.96, # 通过4个参数控制标题位置"x":0.5,"xanchor":"center","yanchor":"top"})fig.show()

3、改变饼图颜色

上面绘制的饼图是默认的颜色,我们可以对颜色进行设置

第一种是加上颜色参数color:

fig = px.pie(fruit,names="name",values="number",color="number" # 颜色参数)fig.show()

第二种是通过参数color_discrete_sequence

fig = px.pie(fruit,names="name",values="number",# 不同颜色:RdBu、Peachcolor_discrete_sequence=px.colors.sequential.Plotly3 # Plotly3可以变成不同颜色)fig.show()

第三种是通过字典的形式来设置颜色:

fig = px.pie(fruit,names="name",values="number",color="name",color_discrete_map={ # 下面是通过字典形式来设置每个分组的颜色'葡萄':'lightcyan','菠萝':'cyan','苹果':'royablue','香蕉':'darkblue','梨':'red'})fig.show()

4、饼图文本信息设置

fig = px.pie(fruit,names="name",values="number")fig.update_traces(# 文本显示的4种位置:['inside', 'outside', 'auto', 'none']textposition='inside', # percent、label、value的组合或者单独出现textinfo='percent+label', # 文本信息的3种朝向:horizontal(默认)、radial、tangentialinsidetextorientation='horizontal')fig.show()

5、甜甜圈图的绘制

甜甜圈图指的是饼图的中间出现了一个空洞部分:

import plotly.graph_objects as golabels = ['Oxygen','Hydrogen','Carbon_Dioxide','Nitrogen']values = [3000, 1500, 1000, 2500]fig = go.Figure(data=[go.Pie(labels=labels, values=values, hole=.4 # 空洞的比例大小)])fig.show()

6、剥离扇形区域

import plotly.graph_objects as golabels = ['Oxygen','Hydrogen','Carbon_Dioxide','Nitrogen']values = [3000, 1000, 4000, 2500]fig = go.Figure(data=[go.Pie(labels=labels, values=values, pull=[0.3,0.1,0,0] # 设置脱离参数)])fig.show()

7、旭日图的制作

我们以Plotly中自带的tips消费数据来绘制旭日图:

fig = px.sunburst(tips,path=['day','time','sex'], # 最里层是day,中间是time,最外层是sexvalues='total_bill')fig.show()

给旭日图设置颜色:

df = px.data.tips()fig = px.sunburst(df, path=['time', 'sex', 'day'], # 从最里层到最外层values='total_bill', # 数据color='day' # 颜色)fig.show()

绘制面积图

使用的是Plotly中自带的gdp数据集:

# area 图px.area(gapminder, # 数据集 x="year", # xy轴的数据y="pop",color="continent", # 颜色line_group="country" # 线型分组)

绘制直方图

px.histogram(tips, # 绘图数据x="sex", # 指定两个数轴y="tip",histfunc="avg", # 直方图函数:均值color="smoker", # 颜色取值barmode="group", # 柱状图模式facet_row="time", # 横纵纵轴的字段设置facet_col="day",category_orders={"day":["Thur","Fri","Sat","Sun"], # 分类"time":["Lunch","Dinner"]})

联合分布图

联合分布图是将多个不同类型的图形放置在一个大的画布中,比如我们使用鸢尾花数据集绘制联合分布图:

px.scatter(iris,x="sepal_width",y="sepal_length",color="species",marginal_x="histogram",marginal_y="rug")

绘制散点矩阵图

散点矩阵图是将多个散点图并排显示,同时显示不同指标之间的关系:

使用Plotly中自带的iris数据集:

px.scatter_matrix(iris, # 绘图数据dimensions=["sepal_width","sepal_length","petal_width","petal_length"], # 不同的指标color="species" # 颜色)

绘制密度图

第一种是绘制密度热力图:

px.density_heatmap(iris,x="sepal_width",y="sepal_length",marginal_y="rug",marginal_x="histogram" # 在密度图的基础上,指定另外两种图形)

第二种是绘制等值线图:

px.density_contour(iris, # 传入绘图数据x="sepal_width", # 指定xy轴y="sepal_length",color="species", # 颜色设置marginal_x="rug", # 需要传入边缘图形marginal_y="histogram" )

绘制并行分类图

使用的是餐厅消费数据tips

px.parallel_categories(tips, # 传入数据color="size", # 颜色取值color_continuous_scale=px.colors.sequential.Inferno # 颜色变化趋势)

绘制地图图形

第一种方法是通过px.choropleth

px.choropleth(gapminder, # 绘图数据locations="iso_alpha", # 位置color="lifeExp", # 颜色hover_name="country", # 悬停信息animation_frame="year", # 播放按钮设置color_continuous_scale=px.colors.sequential.Plasma, # 颜色连续变化projection="natural earth" # 地图选择)

第二种方法是通过line_geo实现:

gapminder = px.data.gapminder()# gapminder_2002 = gapminder.query("year==2002")gapminder_2002 = gapminder[gapminder["year"] == 2002]gapminder_2002px.line_geo(gapminder_2002,locations="iso_alpha",color="continent",projection="orthographic")

绘制矩阵式树状图

# 选取2002年数据gapminder_2002 = gapminder[gapminder["year"] == 2002]px.treemap(gapminder_2002, # 数据path=[px.Constant('world'), 'continent', 'country'], # 绘图路径:world---continent---countryvalues='pop', # 数据取值color='pop', # 颜色取值hover_data=['iso_alpha']) # 显示数据:国家简称

绘制散点极坐标图

使用的是Plotly中自带的风力wind数据集:

px.scatter_polar(wind, # 数据集r="frequency", # 半径theta="direction", # 角度color="strength", # 颜色symbol="strength", # 符号color_discrete_sequence=px.colors.sequential.Plasma_r) # 颜色

改变图形的背景主题再绘制一次:

fig = px.bar_polar(wind, # 数据集r="frequency", # 半径theta="direction", # 角度color="strength", # 颜色template="plotly_dark", # 主题color_discrete_sequence=px.colors.sequential.Plasma_r) # 颜色fig.show()

颜色面板

Plotly中内置了多种颜色面板可供用户使用,颜色可任意选择,下面进行介绍:

顺序色标系列

渐变的颜色系列,适用于大多数连续数据进行绘图:

px.colors.sequential.swatches()

定性色标系列

该系列的颜色是离散型的,每个子颜色都不相同或者相近,适用于没有自然顺序的数据进行绘图:

px.colors.qualitative.swatches()

分散色标系列

适合于具有自然中点的连续数据,色系会出现突变:

px.colors.diverging.swatches()

周期性色标系列

该色标系列适用于具有自然周期结构的连续数据

px.colors.cyclical.swatches()

ColorBrewer2系列

px.colors.colorbrewer.swatches()

CMOcean系列

px.colors.cmocean.swatches()

卡通主题系列

这是一个卡通系列的颜色面板,颜色是渐变型的

px.colors.carto.swatches()

总结

本文着重讲解了一个新的高级可视化神器:Plotly。从其特点、安装、内置数据集、各种精美图表制作案例介绍、颜色面板等,详细地介绍了Plotly的使用,希望能够对读者有所帮助,也希望读者能够爱上这个高级可视化神器。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。