下载安装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 这个也是非常非常重要的!!!