Python可视化,Python数据分析与可视化从入门到精通
plotly作为Python的新一代数据可视化图库,与matplotlib等传统图库相比,具有以下优势:
好用:作为一个小透明,plotly的chart对象就像一个嵌套的dict,可以通过直接修改对象属性来改变图表形状。学习难度远小于matplotlib。动态交互:plotly绘制的图形是交互图形。可以点击查看数据,拖拽放大,隐藏部分数据栏等。您还可以将它们导出为静态图形,这大大增加了您的灵活性。前端能力:基于plotly和React开发的Dash,号称是ML和数据科学模型的前端,基于它可以很容易地用Python构建机器学习应用app。一般来说,plotly有两个通用的绘图界面:
首先是一个面向对象的绘图接口:plotly.graph_objs(简称go),也是最基本的绘图接口。第二个是面向功能的快速绘图接口:plotly.express(简称px),是封装在go上的更方便的绘图接口。在这篇文章中,我们将根据以下三个部分用简单的术语解释如何使用plotly。记得收藏,关注,喜欢。
第一部分:深入原理,本文第一节和第二节分别介绍go和px的设计思想和绘图原理。第二部分:简单的例子。本文第三和第四节对比展示了go和px的五个绘制实例(柱形图、折线图、散点图、热图和直方图)。第三部分:深入实践。本文的第五部分展示了plotly和机器学习的一些综合应用实例。注:本文末尾提供了完整的代码、数据和技术交流。
1.plotly.graph_objs绘制原理plotly的图形是由数据(数据,包括图表类型(折线图、散点图、面积图、饼图)和具体的数据值信息)和布局(布局,包括xaxis、yaxis、标题、图例等)组成的对象。).
像一个透明的嵌套Python字典一样,Figure对象可以通过修改元素值来改变它的形状。
将numpy作为np导入
导入plotly.graph_objs as go
epoches=np.arange(20)
accs=1-0.9/(epoches 1)
数据=go。Scatter(x=epoches,y=accs,mode=lines markers ,name=acc ,
marker=dict(size=8,color=blue ),
line=dict(width=2,color=blue ,dash=dash ))
layout={title :通过历元的精确度,
xaxis.title :纪元,
yaxis.title :准确性,
font.size:15}
fig=go。图(数据=数据,布局=布局)
图显示()
如果你想把图表的颜色改成红色实线呢?很简单。先把(fig)打印出来,观察它的结构,找出如何获取线条颜色和线型的属性,然后直接给对应的属性赋值。
Print(fig.data) #如果想获取fig更详细的结构信息,可以直接点击fig.to_dict()(Scatter({
line: {color: blue , dash: dash , width: 2},
标记:{ 颜色:蓝色,大小:8},
模式:线条标记,
名称: acc ,
x :数组([ 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,
18, 19]),
y :数组([0.1,0.55,0.7,0.775,0.82,0.85,
0.87142857, 0.8875 , 0.9 , 0.91 , 0.91818182, 0.925 ,
0.93076923, 0.93571429, 0.94 , 0.94375 , 0.94705882, 0.95 ,
0.95263158, 0.955 ])
}),)fig.data[0].line.color=red
fig.data[0].line.dash=solid
无花果
怎么样?plotly是当之无愧的小透明。
上述直接修改图形对象属性值的方法有些粗鲁,并且缺乏对透明性的尊重。
其实plotly的Figure对象提供了Figure等方法。更新_布局和图。Update _ Data让小透明在面对突如其来的变化时看起来更体面。
将numpy作为np导入
导入plotly.graph_objs as go
epoches=np.arange(20)
accs=1-0.9/(epoches 1)
fig=go。图(数据=go。Scatter(x=epoches,y=accs,mode=lines markers ,name=acc ,
marker=dict(size=8,color=blue ),
line=dict(width=2,color=blue ,dash=dash ))
图显示()
fig . update _ traces(patch={ line . color : red , line.dash:solid},选择器=dict(name=acc ))
图.更新布局({ 标题:通过历元的精度,
xaxis.title :纪元,
yaxis.title :准确性,
font.size:15})
图显示()
二。plotly.express绘制原理使用import plotly.graph_objs的go接口作为go绘制图表其实很简单。一般类型的图表三五行代码就可以搞定。
但是我还是想偷懒。我能在一行代码中得到最常用的图表吗?
当然,普洛特利。快递只给你。英语单词express的意思是特快线、特快列车。就像营养快车英语,Nutri-express。
plotly.express的原理很简单。图形不是主要由数据(痕迹)和布局组成吗?
数据部分被传递到pandas的DataFrame中,而布局部分可以由模板template指定。一行代码就完成了。
当然,有时模板的一些微观形式可能与用户想要的不完全相同。您可以通过使用生成的图形作为小透明来直接修改属性。
将plotly.express导入为px
将numpy作为np导入
进口熊猫作为pd
dfdata=pd。data frame({ epoch :NP . arange(20), accuracy :1-0.9/(NP . arange(20)1)})
fig=px.line(data_frame=dfdata,x=epoch ,y=accuracy ,title=accuracy via epoch )
图显示()
如你所见,plotly.express已经帮助我们设置了坐标轴标题等等。
但是整体看起来还是不太好看。好大的事啊!分分钟改变透明度!
fig . update _ traces(patch=dict(mode= lines markers ,
marker=dict(size=8,color=blue ),
line=dict(width=2,color=red ,dash=solid ),
Selector=dict(type= scatter )#使用patch指定修补程序,使用selector指定数据修补程序。
fig . update _ layout({ font . size :15 })
图显示()
除了精细地修改图形属性之外,更改图形外观的更快方法是更改模板。
plotly导入
打印(plotly.io.templates)
fig.layout.template=seaborn
figTemplates配置
-
默认模板:“plotly”
可用模板:
[ggplot2 , seaborn , simple_white , plotly ,
plotly_white , plotly_dark , presentation , xgridoff ,
ygridoff , gridon , none]
三。常用图表go绘制示例plotly支持多种图表类型,包括各种基础图表、统计图表、财务图表、机器学习图表、地图图表等。
详情见https://plotly.com/python/画廊示例。
这里只介绍最基本最常用的五种基本图表类型:柱形图、折线图、散点图、热图、柱状图。
先用go接口展示一下画图示例,再用px接口实现一遍作为对比。
1.柱形图柱形图适用于展示几组数据之间的对比关系,柱形图的数据个数一般不宜过多。
进口熊猫作为pd
导入plotly.graph_objs as go
x=[f1 , f2 , f3 , f4 , f5]
y1=[5,20,36,10,75]
y2=[10,25,8,60,20]
TraceA=go。Bar(x=x,y=y1,name=模型a )
TraceB=go。Bar(x=x,y=y2,name= model b )
布局=go。布局(title=功能重要性分析,xaxis={title :功能 },
Yaxis={title: importance},barmode= group) # barmode是 relative , overlay , group 之一
fig=go。图(data=[traceA,traceB],layout=layout)
图显示()
#互换X轴和Y轴的含义,方位设为水平,就成了水平条形图。
进口熊猫作为pd
导入plotly.graph_objs as go
x=[f1 , f2 , f3 , f4 , f5]
y1=[5,20,36,10,75]
y2=[10,25,8,60,20]
TraceA=go。Bar(x=y1,y=x,名称=型号A ,方向=h )
TraceB=go。条形(x=y2,y=x,名称=型号B ,方向=h )
布局=go。布局(title=功能重要性分析,xaxis={title :重要性 },
yaxis={ title : characters },barmode= group) # barmode是 relative , overlay , group 之一
fig=go。图(data=[traceA,traceB],layout=layout)
图显示()
2.折线图折线图适用于描述两个变量之间的函数关系。例如,它通常用于描述变量随时间的变化趋势。
进口熊猫作为pd
导入plotly.graph_objs as go
日期=[2021-{:0 2d}”。范围(1,13)中s的格式]
acc=[70,72,80,65,76,80,60,67,80,90,94,82]
回忆=[65,42,35,25,67,54,34,45,38,46,64,34]
fig=go。图()
图add _ trace (go.scatter (x=日期,y=ACC,name=精度,mode=线条标记))
图add_trace(去分散(x=)日期,y=回忆,名称=召回率,模式=线条标记))
图。更新布局({ 标题:线上模型表现变化趋势, xaxis.title :月份, yaxis.title :指标})
图.更新布局({ font :{ size :15 } })
图显示()
#以上图表中的x轴刻度被自动换成了英文时间,不是很方便识别,使用如下设置直接指定刻度位置和刻度显示内容。
图。更新布局(
xaxis=dict(tickmode=array ,
tickvals=x,
ticktext=x,
票角=60
)
)
图显示()
3,散点图散点图适合表现大量样本的多个属性的分布规律。散点图的每个点表示一个样本,每个坐标维度表示一个属性。
当样本属性维度多于2个时,可以使用点的颜色或大小等方式来表达更多属性维度。
进口熊猫作为螺纹中径
导入plotly.graph_objs as go
dfboy=pd .数据帧()
dfboy[weight]=[56,67,65,70,57,60,80,85,76,64]
df男生[身高]=[162170168172168172180176178170]
dfboy[身体质量指数]=dfboy[体重]/(dfboy[身高]**2)
dfgirl=pd .数据帧()
dfgirl[weight]=[50,62,60,70,57,45,62,65,70,56]
df女生[身高]=[155162165170166158160170170172165]
dfgirl[性别]=女性
dfgirl[身体质量指数]=dfgirl[体重]/(dfgirl[身高]**2)
trace1=go .Scatter(x=dfboy[体重],y=dfboy[身高],模式=标记,name=男性,
marker=dict(color=blue ,size=3e5*dfboy[身体质量指数],sizemode=area ))
trace2=go .Scatter(x=dfgirl[体重],y=dfgirl[身高],模式=标记,name=女性,
marker=dict(color=red ,size=3e5*dfgirl[身体质量指数],
sizemode=area ))
布局=去吧.布局({title :身高体重,
xaxis.title :重量,
yaxis.title :高度,
legend.title :性别,
font.size:15})
去吧.图(数据=[轨迹1,轨迹2],布局=布局)
图显示()
4,热力图热力图可以直观地展示一个二维矩阵的取值,它将一个矩阵的每个元素取值对应到热力图上的一个像素颜色取值。
将数组作为铭牌导入
导入plotly.graph_objs as go
arr=np.random.normal(loc=0,scale=1,size=[10,10])
trace=go .热图(x=np.arange(10),y=np.arange(10),z=arr,
colorscale=Viridis ,showscale=True,reversescale=False)
布局=去吧.布局(宽度=600,高度=600)
去吧.图(数据=轨迹,布局=布局)
图显示()
5,直方图直方图适合呈现一组数据的统计分布规律,它计算这组数据落在各个小的分段区间的样本个数并用类似柱状图的方式展示出来。
将数组作为铭牌导入
导入plotly.graph_objs as go
scores=np.random.randint(下限=0,上限=100,大小=1000)
trace=go .直方图(x=分数,histnorm=密度,nbinsx=60)
去吧.图(轨迹)
图. update _ layout({ title :得分分布, xaxis.title :得分, yaxis.title :频率,模板: seaborn})
图显示()
四,常用图表像素绘图范例作为对比,下面使用plotly.express接口绘制5种最常用的基础图表:
柱形图、折线图、散点图、热力图、直方图。
1,柱形图柱形图适合表现几组数据之间的对比关系,柱形图的数据的数量一般不宜太多。
进口熊猫作为螺纹中径
将plotly.express导入为像素
x=[f1 , f2 , f3 , f4 , f5]
y1=[5,20,36,10,75]
y2=[10,25,8,60,20]
df=pd .数据帧({ 特征:x,模型答:y1模型B: y2})
fig=px.bar(data_frame=df,x=特征,y=[模型一个,模型B],
title=特征重要性分析,barmode=group) #barmode是相对,覆盖,组之一
fig.layout.yaxis.title=重要性
图。显示()#互换x轴和y轴含义,变成水平条形图
进口熊猫作为螺纹中径
将plotly.express导入为像素
x=[f1 , f2 , f3 , f4 , f5]
y1=[5,20,36,10,75]
y2=[10,25,8,60,20]
df=pd .数据帧({ 特征:x,模型答:y1模型B: y2})
fig=px.bar(data_frame=df,x=[模型一个,模型B],y=特征,
title=特征重要性分析,barmode=relative) #barmode是相对,覆盖,组之一
fig.layout.xaxis.title=重要性
图显示()
2,折线图折线图适合描述两个变量之间的函数关系,例如常用它来描述一个变量随时间的变化趋势。
进口熊猫作为螺纹中径
将plotly.express导入为像素
x=[2021-{:0 2d}”.范围(1,13)中s的格式]
y1=[70,72,80,65,76,80,60,67,80,90,94,82]
y2=[65,42,35,25,67,54,34,45,38,46,64,34]
dfdata={ 月份:x,召回率:y1,准确率:y2}
fig=px.line(data_frame=dfdata,x=月份,y=[召回率,准确率],title=线上模型表现变化趋势)
fig.layout.yaxis.title=指标
图.更新布局({ font :{ size :15 } })
图显示()以上图表中的x轴刻度被自动换成了英文时间,不是很方便识别,使用如下设置直接指定刻度位置和刻度显示内容。
图。更新布局(
xaxis=dict(tickmode=array ,
tickvals=x,
ticktext=x,
票角=60
)
)
无花果
3,散点图散点图适合表现大量样本的多个属性的分布规律。散点图的每个点表示一个样本,每个坐标维度表示一个属性。
当样本属性维度多于2个时,可以使用点的颜色或大小等方式来表达更多属性维度。
进口熊猫作为螺纹中径
将plotly.express导入为像素
dfboy=pd .数据帧()
dfboy[weight]=[56,67,65,70,57,60,80,85,76,64]
df男生[身高]=[162170168172168172180176178170]
dfboy[性别]=男性
dfgirl=pd .数据帧()
dfgirl[weight]=[50,62,60,70,57,45,62,65,70,56]
df女生[身高]=[155162165170166158160170170172165]
dfgirl[性别]=女性
dftotal=pd.concat([dfboy,dfgirl])
dftotal[身体质量指数]=dftotal[体重]/(dftotal[身高]**2)
fig=px。scatter(data _ frame=df total,x=体重,y=身高,color=性别,size=身体质量指数,
color_discrete_map={ 男性:蓝色,女性:红色 },
title=身高体重)
图.更新布局({ font :{ size :15 } })
无花果
4,热力图热力图可以直观地展示一个二维矩阵的取值,它将一个矩阵的每个元素取值对应到热力图上的一个像素颜色取值。
将数组作为铭牌导入
将plotly.express导入为像素
arr=np.random.normal(loc=0,scale=1,size=[10,10])
px.imshow(arr,color_continuous_scale=blues )
5,直方图直方图适合呈现一组数据的统计分布规律,它计算这组数据落在各个小的分段区间的样本个数并用类似柱状图的方式展示出来。
将数组作为铭牌导入
将plotly.express导入为像素
scores=np.random.randint(下限=0,上限=100,大小=1000)
图=像素直方图(x=分数,histnorm=密度,nbins=60)
图更新布局({ xaxis。标题:分数 })
figimport plotly
plotly.io.write_html(fig, score_distribution.html )
五,在机器学习中应用plotly本例将使用plotly辅助进行catboost二分类建模的一些可视化分析。
从IPython .显示器导入显示
导入日期时间,json
将数组作为铭牌导入
进口熊猫作为螺纹中径
将catboost作为可换股债券导入
从实例导入数据集
从sklearn.model_selection导入训练_测试_拆分
从sklearn.model_selection导入分层文件夹
从sklearn.metrics导入f1_score,roc_auc_score,roc_curve,accuracy_score,precision_recall_curve,auc
导入plotly.graph_objs as go
将plotly.express导入为像素
从情节。次要情节导入制作_支线剧情
定义打印日志(信息):
nowtime=datetime.datetime.now().strftime(%Y-%m-%d %H:%M:%S )
打印( \ n ====== * 8 % s % now time
打印(信息.\n\n )
#================================================================================
# 一,准备数据
#================================================================================
打印日志(步骤1:准备数据.)
dfdata=pd.read_csv(./数据/泰坦尼克号/火车。CSV’)
dftest=pd.read_csv(./数据/泰坦尼克号/测试。CSV’)
label_col=幸存
# 填充空值特征
dfnull=pd .DataFrame(dfdata.isnull().总和(轴=0),columns=[null_cnt]).查询( null_cnt 0 )
dfdata.fillna(-9999,inplace=True)
dftest.fillna(-9999,inplace=True)
# 刷选类别特征
cate _ cols=[x for x in df data。列
if dfdata[x].类型不在[浮点32,浮点64]和x!=标签_列]
对于目录栏中的列:
dfdata[col]=pd .分类(dfdata[col])
dftest[col]=pd .分类(dftest[col])
# 分割数据集
dftrain,df valid=train _ test _ split(df数据,train_size=0.75,random_state=42)
Xtrain,Ytrain=dftrain.drop(label_col,axis=1),dftrain[label_col]
Xvalid,Yvalid=dfvalid.drop(label_col,axis=1),dfvalid[label_col]
# 整理成泳池
pool_train=cbPool(data=Xtrain,label=Ytrain,cat_features=cate_cols)
池_有效=cb .Pool(data=Xvalid,label=Yvalid,cat _ features=cate _ cols)
#================================================================================
# 二,设置参数
#================================================================================
打印日志(步骤2:设置参数.)
迭代次数=1000
早停轮次=200
params={
learning_rate: 0.05,
“损失函数”:CB。度量标准。日志丢失(),
eval(102,153,0);边距:0px填充:0px 背景:none 0% 0%/自动重复滚动填充框边框-框rgba(0,0,0,0);AUC ,
深度:6,
分叶数据:20,
随机种子:42,
logging_level: Silent ,
use_best_model: True,
boosting_type“:”有序,
nan_mode: Min
}
#================================================================================
# 三,训练模型
#================================================================================
打印日志(步骤3:训练模型.)
型号=cb .CatBoostClassifier(
迭代次数=迭代次数,
早停轮次=早停轮次
train_dir=catboost_info/,
* *参数
)
模型。适合(
联营火车
eval(215,58,73);边距:0px填充:0px背景:none 0% 0%/auto repeat scroll padding-box border-box rgba(0,0,0,0);=池_有效
plot=True
)
#================================================================================
# 四,评估模型
#================================================================================
printlog(step4: eval(89,89,89);边距:0px填充:0px 背景:none 0% 0%/auto repeat scroll padding-box border-box rgba(0,0,0,0);y _ pred _ train=模型。预测(Xtrain)
y _ pred _ valid=模型。预测(Xvalid)
train_score=f1_score(Ytrain,y_pred_train)
有效分数=f1分数(Yvalid,y_pred_valid)
打印(训练f1_score: {:5} .格式(train_score))
打印(有效的f1_score: {:5} \n .格式(有效分数))
#功能重要性
df重要性=模型。get _ feature _ importance(前提=True)
df重要性=df重要性。sort _ values(by= Importances ).iloc[-20:]
fig _重要性=px。bar(df重要性,x=重要性,y=特征Id ,title=特征重要性)
fig_importance.show()
#分数分布
y _ test _ prob=模型。predict _ proba(dftest。drop(label _ col,axis=1))[:-1]
图_hist=px。直方图(
x=y_test_prob,color=dftest[label_col],nbins=50,
title=分数分布,
labels=dict(color=True Labels ,x=Score )
)
fig_hist.show()
#ROC-AUC PR-AUC
fpr,tpr,thresholds _ roc=roc _ curve(df test[label _ col],y_test_prob)
precision,recall,thresholds _ pr=precision _ recall _ curve(df测试[label _ col],y_test_prob)
fig=make _ subplot(rows=1,cols=2,horizontal_spacing=0.1,vertical_spacing=0.1,
start_cell=左上,# 左下 左下,
subplot_titles=[
福禄克曲线(ROC-AUC={auc(fpr,tpr):4f}),
fPR曲线(PR-AUC={auc(回忆,精度):4f}),]
)
#ROC曲线
图add_trace(去。散点图(x=fpr,y=tpr,mode=lines ,stackgroup=1 ,name=roc_curve ),row=1,col=1)
fig.add_shape(type=line ,line=dict(dash=dash ),x0=0,x1=1,y0=0,y1=1,row=1,col=1)
fig.update_xaxes(title_text=假阳性率行=1,列=1)
fig.update_yaxes(title_text=真阳性率行=1,列=1)
#公关曲线
图add_trace(去。散点图(x=回忆,y=精度,模式=线条,堆栈组=1 ,名称=pr_curve ),行=1,列=2)
fig.add_shape(type=line ,line=dict(dash=dash ),x0=0,x1=1,y0=1,y1=0,row=1,col=2)
图update _ xaxes(title _ text= Recall ,row=1,col=2)
图update _ yaxes(title _ text= Precision ,row=1,col=2)
fig . update _ layout({ height :500, width:1000, showlegend:False})
图显示()
#================================================================================
# 5,使用模型
#================================================================================
printlog(步骤5:使用模型.)
y _ pred _ test=model . predict(df test . drop(label _ col,axis=1))
y _ pred _ test _ prob=model . predict _ proba(dftest . drop(label _ col,axis=1))
#================================================================================
# 6,保存模型
#================================================================================
printlog(步骤6:保存模型.)
模型目录= catboost _模型
模型.保存模型(模型目录)
型号_装载=cb。CatBoostClassifier()
模型.负载_模型(模型_目录)
以上。
技术交流欢迎转载,收藏,有所收获,喜欢,支持!数据和代码可以从我这里获得。
目前已开通技术交流群,群友2000多人。最好的添加笔记的方法是:兴趣来源,这样才能找到志同道合的朋友。
方法:发送下图至微信,长按识别,后台回复:加群;途径,微信搜索微信官方账号:Python学习与数据挖掘,后台回复:加群。
转载请联系作者授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。