数据分析绘图之plotly

下载安装plotly

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple plotly

学plotly这个第三方库呢首先要明白一个是作图,一个是画布,在plotly中图表就是轨迹(trace),画布就是用来展现轨迹的一块布,没有画布的话我们作的图就不能呈现,一个画布可以显示多个轨迹。在用plotly这个库的时候我们可以用两种方式来绘图。

第一种

 import plotly.graph_objs as go  # 第一种
 import plotly.express as px  # 第二种

两种都能画图,但是我个人觉得第一种太废代码了,
如果你想要特别好看的图,第一种的方法有很多属性让你去调。
相对来说第二种适合数据分析,因为它可以直接传入DataFrame
作为数据,而且相对也好理解一些。其实第二种就是第一种简化
的接口。

如果小伙伴想学第一种,可以去看看这位博客写的文章

https://blog.csdn.net/chinesehuazhou2/article/details/130312926

接下来就进入plotly的学习吧。

线形图(line)

1.数据导入(我用的jupyter notebook软件)

import pandas as pd
import numpy as np
import plotly.express as px  

# 数据集
gapminder = px.data.gapminder()
gapminder.head()  # 取出数据,默认5条

前5条数据如下

2.绘图

# 线性图
# line 图
fig = px.line(
  gapminder,  # 数据集
  x="year",  # 横坐标
  y="lifeExp",  # 纵坐标
  color="continent",  # 颜色的数据
  line_group="continent",  # 线性分组
  hover_name="country",   # 悬停hover的数据
  line_shape="spline",  # 线的形状
  render_mode="svg"  # 生成的图片模式
)
fig.show()

3.图片

小结:用px.line()的方法可以很快作出线形图,它的参数基本上是数据集,横坐标x,纵坐标y,区别颜色color,鼠标悬停数据hover_name,当然还有线性分组line_group,线的形状line_shape等等。

注意:这些参数必须都是数据集的某列。

散点图(scatter)

px.scatter(
  gapminder   # 绘图DataFrame数据集
  ,x="gdpPercap"  # 横坐标
  ,y="lifeExp"  # 纵坐标
  ,color="continent"  # 区分颜色
  ,size="pop"   # 区分圆的大小
  ,size_max=60  # 散点大小
)

散点图用到了scatter()函数,它的参数第一个还是我们的数据集其他属性都是数据集中的某一列。

图效果:

其实散点图有点类似于气泡图,散点大小通过size_max来调节。 

 对以上的图我们还可以让自动化展示,加上 animation_frame 这个参数就可以在图形下面形成一个滚动条,我们的图形会随着滚动条滑动而改变,设置 facet_col 这个参数可以将图形进行分格显示,还可以设置lables,让属性名字变化的更直观。

px.scatter(
  gapminder   # 绘图使用的数据
  ,x="gdpPercap" # 横纵坐标使用的数据
  ,y="lifeExp"  # 纵坐标数据
  ,color="continent"  # 区分颜色的属性
  ,size="pop"   # 区分圆的大小
  ,size_max=60  # 圆的最大值
  ,hover_name="country"  # 图中可视化最上面的名字
  ,animation_frame="year"  # 横轴滚动栏的属性year
  ,facet_col="continent"   # 按照洲continent属性进行分格显示
  ,labels=dict(pop="Populations",  # 属性名字的变化,更直观
               gdpPercap="GDP per Capital",
               lifeExp="Life Expectancy")
)

图形如下:

 找到一份散点图定义的开源代码:

def scatter(data_frame, x=None, y=None, color=None, symbol=None, size=None, 
            hover_name=None, hover_data=None, text=None, facet_row=None, 
            facet_col=None, error_x=None, error_x_minus=None, error_y=None, 
            error_y_minus=None, animation_frame=None, animation_group=None, 
            category_orders={}, labels={}, color_discrete_sequence=None, 
            color_discrete_map={}, color_continuous_scale=None, 
            range_color=None, color_continuous_midpoint=None, 
            symbol_sequence=None, symbol_map={}, opacity=None,
            size_max=None, marginal_x=None, marginal_y=None, trendline=None,
            trendline_color_override=None, log_x=False, log_y=False,
            range_x=None, range_y=None, render_mode='auto', title=None, 
            template=None, width=None, height=None):

    return

参数详解如下(常用的标红):

  • data_frame:目标数据,类型为dataframe;

  • x :指定列名。列中的值用于笛卡尔坐标中沿 X 轴的定位标记。图表类型为水平柱状图时,这些值用作参数histfunc的入参;

  • y :指定列名。列中的值用于笛卡尔坐标中沿 Y 轴的定位标记。图表类型为垂直柱状图时,这些值用作参数histfunc的入参;

  • color:指定列名。为列中的不同值,(由px)自动匹配不同的标记颜色;若列为数值数据时,还会自动生成连续色标;

  • symbol:指定列名。为列中的不同值,设置不同的标记形状;

  • size:指定列名。为列中的不同值,设置不同的标记大小;

  • hover_name:指定列名。将列中的值,加粗显示在悬停提示内容的正上方;

  • hover_data:指定列名组成的列表。所有列的值,显示在悬停提示内容中,位于x/y值的下方。指定的列与x/y重复时仅显示1条数据;

  • text:指定列名。列中的值,在图的标记中显示为文本标签,同时也显示在悬停提示内容中;

  • facet_row:指定列名。根据列中不同的(N个)值,在垂直方向上显示N个子图,并在子图右侧,垂直方向上,进行文本标注;

  • facet_col:指定列名。根据列中不同的(N个)值,在水平方向上显示N个子图,并在子图上方,水平方向上,进行文本标注;

  • error_x:指定列名。显示误差线,列中的值用于调整 X 轴误差线的大小。如果参数error_x_minus == None,则悬停提示内容中,显示对称的误差值;否则显示正向的误差值。该列通常是基于元数据加工的结果,目的是统计元数据指标的误差值,一般会用元数据除以100的整数倍。

  • error_x_minus:指定列名。列中的值用于在负方向调整 X 轴误差线的大小,如果参数error_x==None,则直接忽略该参数;

  • error_y:指定列名。显示误差线,列中的值用于调整 Y 轴误差线的大小。如果参数error_y_minus == None,则悬停提示内容中,显示对称的误差值;否则显示正向的误差值。该列通常是基于元数据加工的结果,目的是统计元数据指标的误差值,一般会用元数据除以100的整数倍。

  • error_y_minus:指定列名。列中的值用于在负方向调整 Y 轴误差线的大小,如果参数error_y==None,则直接忽略该参数;

  • animation_frame:指定列名。列中的值用于为动画帧指定标记,即设置滑动条;

  • animation_group:指定列名。列中的值用于提供跨动画帧的联动匹配;

  • category_orders:带有字符串键和字符串列表值的字典,默认为{},此参数用于强制每列的特定值排序,dict键是列名,dict值是指定的排列顺序的字符串列表。默认情况下,在Python 3.6+中,轴,图例和构面中的分类值的顺序取决于在data_frame中首次出现的顺序,而在3.6以下的Python中,默认不保证顺序,该参数即为解决此类问题而设计;

  • labels:带字符串键和字符串值的dict,默认为{}。此参数用于修改图表中显示的列名称。默认情况下,图表中使用列名称作为轴标题、图例条目、悬停提示等,此参数可以进行修改,dict的键是列名,dict值是修改的新名称;

  • color_discrete_sequence:有效的CSS颜色字符串列表,取自plotly_express的color子模块。当参数color指定的列不是数值数据时,该参数为color列指定颜色序列,若category_orders参数不为None,则按category_orders中设定的顺序循环执行color_discrete_sequence,除非color列的值在参数color_discrete_map入参的dict键中;

  • color_discrete_map:带字符串键和有效CSS颜色字符串值的dict,默认为{}。当参数color指定的列不是数值数据时,该参数用于将特定颜色分配给,与特定值对应的标记,color_discrete_map中的键为color表示的列值。其优先级高,会覆盖color_discrete_sequence参数中的设置;

  • color_continuous_scale:有效的CSS颜色字符串列表,取自plotly_express的color子模块。当参数color指定的列是数值数据时,为连续色标,设置指定的颜色序列。实际上,color指定列时,px会自动匹配颜色:1)若指定列是数值数据,通过参数color_continuous_scale可以设定具体的颜色序列;2)若指定列是非数值数据时,通过参数color_discrete_sequence可以设定具体的颜色序列(循环匹配);通过参数color_discrete_map可以为列中不同值,指定具体的颜色;

  • range_color:2个数字元素组成的列表,参数用于设定连续色标上的自动缩放,即边界的大小值;

  • color_continuous_midpoint:数字,默认为无。如果设置,则计算连续色标的边界以具有所需的中点。 若使用plotly_express.colors.diverging色标作为color_continuous_scale的如参时,建议设置此值;

  • symbol_sequence:定义plotly.js符号的字符串列表。参数用于为列中的值分配符号,除非symbol的值是symbol_map中的键。分配符号的顺序:按按category_orders中设置的顺序循环执行;

  • symbol_map:带字符串键和定义plotly.js符号的字符串值的dict,默认值{}。该参数用于将特定符号分配给,与特定值对应的标记,symbol_map中的键为symbol表示的列值。其优先级高,会覆盖symbol_sequence参数中的设置;

  • opacity:数字,介于0和1之间,设置标记的不透明度;

  • size_max:整数,默认为20。使用size参数时,设置最大标记的大小;

  • marginal_x:字符串,取值:rug(细条)、box(箱图)、violin(小提琴图)、histogram(直方图)。该参数用于在主图上方,绘制一个水平子图,以便对x分布,进行可视化;

  • marginal_y:字符串,取值:rug(细条)、box(箱图)、violin(小提琴图)、histogram(直方图)。该参数用于在主图右侧,绘制一个垂直子图,以便对y分布,进行可视化;

  • trendline:字符串,取值:ols、lowess、None。取值为ols时,将为每个离散颜色/符号组,绘制一个普通最小二乘回归线;取值为lowess时,则将为每个离散颜色/符号组,绘制局部加权散点图平滑线;

  • trendline_color_override:字符串,有效的CSS颜色。如果设置了参数trendline趋势线,则将以此颜色绘制所有趋势线;

  • log_x:布尔值,默认为False。如果为True,则 X 轴在笛卡尔坐标系中进行对数缩放;

  • log_y:布尔值,默认为False。如果为True,则 Y 轴在笛卡尔坐标系中进行对数缩放;

  • range_x:2个数字元素组成的列表,用于设定笛卡尔坐标中 X 轴上的自动缩放,即边界的大小值;

  • range_y:2个数字元素组成的列表,用于设定笛卡尔坐标中 Y 轴上的自动缩放,即边界的大小值;

  • render_mode:字符串,取值:auto(默认)、svg、webgl。用于控制绘制标记的浏览器API,svg适用于少于1000的数据,并允许完全矢量化输出;webgl可以接收1000点以上的数据;auto使用启发式方法来选择模式;

  • title:字符串,设置图表的标题;

  • template:字符串或Plotly.py模板对象,设置图表的背景颜色。有三个内置的 Plotly 主题: plotly, plotly_white 和 plotly_dark;

  • width:整数,默认无,设置图表的宽度(以像素为单位);

  • height:整数,默认600,设置图表的高度(以像素为单位)

 所有图表的参数都和散点图大差不差,后面不在赘述。

柱状图(bar)

fig = px.bar(
  tips,  # 数据集
  x="sex",  # 横轴
  y="total_bill",  # 纵轴
  color="smoker",  # 颜色参数取值
  barmode="group",  # 柱状图模式取值
  facet_row="time",  # 行取值
  facet_col="day",  # 列元素取值
  category_orders={
    "day": ["Thur","Fri","Sat","Sun"],  # 分类顺序
    "time":["Lunch", "Dinner"]})
fig.show()

这里用到了px的内置数据集,使用前要导入 tips = px.data.tips()

这是餐馆的订单流水。包含字段:总账单、小费、性别、是否抽烟、星期几、就餐时间、人数;

柱状图如下:

直方图 (histogram)

fig = 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"]}
)

fig.show()

 直方图如下:

啊,有点累,我也是小白感觉学着有点卡顿,到这里总结一下吧。

对于数据分析师来说至少需要掌握散点,折线,柱状图,饼图,气泡图,漏斗图。

因为饼图,气泡图,漏斗图我没用过px这种方法,小伙伴们可以去看我上面推荐的那个博客,他里面有详情的做法,唉,今天又是当fw的一天,脑壳疼,晚上还要上课,今天就先到这吧。呜呜呜呜呜。

对了,最最最最最最最最最最后一件事,这两种方法一定要结合起来使用,因为他们俩本身就是一个底层API和一个简化的API,大多数简化解决不了的就用最底层的那个去解决,也就是

import plotly.graph_objs as go 这个也是非常非常重要的!!!

  • 20
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值