屈希峰作家大数据DT根源文婧编辑

Python数据可视化:5段代码搞定散点图绘制与运用,值得保藏

什么是散点图?可以用来呈现哪些数据联系?数据剖析进程中可以办理哪些题目?怎样用Python绘制散点图?本文一一为你解答。

首页

135editor.com">

01 概述

散点图(Scatter)又称散点分布图,是以一个变量为横坐标,另一个变量为纵坐标,应用散点(坐标点)的分布样式反应变量统计联系的一种图形。

特性是能直观外现出影响因素和预测对象之间的总体联系趋势。优点是能通过直观耀眼的图形方法反应变量间联系的改造样式,以便决议用何种数学外达方法来模拟变量之间的联系。散点图不光可转达变量间联系类型的新闻,槐ボ反应变量间联系的明晰程度。

通过察看散点图数据点的分布状况,我们可以推测出变量间的相关性。假如变量之间不保管互相联系,那么散点图上就会外现为随机分布的离散的点,假如保管某种相关性,那么阵势部的数据点就会相对鳞集并以某种趋势呈现。

数据的相关联系大致上可以分为:正相关(两个变量值同时增加)、负相关(一个变量值添加,另一个变量值下降)、不相关、线性相关、指数相关等,外现散点图上的大值乐布如图1所示。那些离点集群较远的点我们称之为离群点或者十分点。
▲图1 散点数据的相关性

Python系统中,可运用Scipy、Statsmodels或Sklearn等对离散点举行回归剖析,归结现稀有据并举行预测剖析。关于那些变量之间保管亲密联系,可是这些联系又不像数学公式和物理公式那样可以准确外达的,散点图是一种很好的图形东西,可以举行直观展现,如图2所示。
▲图2 散点数据拟合(线性)

可是剖析进程中需求当心,变量之间的相关性并不等同于确定的因果联系,仍需求思索其他影响因素。

02 实例

散点图代码示比如下所示。

代码示例①
#数据
x=[1,2,3,4,5]
y=[6,7,2,4,5]
#画布:尺寸
p=figure(plot_width=400,plot_height=400)
#绘图
p.scatter(x,y,
size=20,#screenunits显示器像素单位
#radius=1,#data-spaceunits坐标轴单位
marker="circle",color="navy",alpha=0.5)
#p.circle(x,y,size=20,color="navy",alpha=0.5)
#显示
show(p) 
运转结果如图3所示。
▲图3 代码示例①运转结果

代码示例①中第7行运用scatter方法举行散点图绘制;第11行采用circle方法举行散点图绘制(引荐)。关于这两个方法的参数阐明如下。

p.circle(x, y, **kwargs)参数阐明。
  • x (str or seq[float]) : 离散点的x坐标,列名或列外
  • y (str or seq[float]) : 离散点的y坐标
  • size (str or list[float]) : 离散点的大小,屏幕像素单位
  • marker (str, or list[str]) : 离散点标记类型名称或名称列外
  • color (color value, optional) : 填充及轮廓线的颜色
  • source (`~bokeh.models.sources.ColumnDataSource`) : Bokeh专属数据样式
  • **kwargs: 其他自定义属性;此中标记点类型marker默认值为:“marker="circle"”,可以用“radius”定义圆的半径大小(单位为坐标轴单位)。这Web数据化中十分有用,差别的方法,差别的装惫亓恼瓜中Ч会有些许差别。
p.scatter(x, y, **kwargs)参数阐明。
  • (:class:`~bokeh.core.properties.NumberSpec` ) : x坐标
  • y (:class:`~bokeh.core.properties.NumberSpec` ) : y坐标
  • angle (:class:`~bokeh.core.properties.AngleSpec` ) : 改变角度
  • angle_units (:class:`~bokeh.core.enums.AngleUnits`) : (default: 'rad') 默认:弧度,也可以采费用('degree')
  • fill_alpha (:class:`~bokeh.core.properties.NumberSpec` ) : (default: 1.0) 填充透后度,默认:不透后
  • fill_color (:class:`~bokeh.core.properties.ColorSpec` ) : (default: 'gray') 填充颜色,默认:灰色
  • line_alpha (:class:`~bokeh.core.properties.NumberSpec` ) : (default: 1.0) 轮廓线透后度,默认:不透后
  • line_cap  (:class:`~bokeh.core.enums.LineCap` ) : (default: 'butt') 线端(帽)
  • line_color (:class:`~bokeh.core.properties.ColorSpec` ) : (default: 'black') 轮廓线颜色,默认:黑色
  • line_dash (:class:`~bokeh.core.properties.DashPattern` ) : (default: []) 虚线
  • line_dash_offset (:class:`~bokeh.core.properties.Int` ) : (default: 0) 虚线偏移
  • line_join (:class:`~bokeh.core.enums.LineJoin`  ) : (default: 'bevel')
  • line_width (:class:`~bokeh.core.properties.NumberSpec` ) : (default: 1) 线宽,默认:1
另外,Bokeh中的少许属性,如`~bokeh.core.properties.NumberSpec `、`~bokeh.core.properties.ColorSpec`可以Jupyter notebook中通过`import bokeh.core.properties.NumberSpec `导入该属性,然后再查看其精细的运用阐明。

代码示例②
#数据
N=4000
x=np.random.random(size=N)*100#随机点x坐标
y=np.random.random(size=N)*100#随机点y坐标
radii=np.random.random(size=N)*1.5#随机半径
#东西条
TOOLS="hover,crosshair,pan,wheel_zoom,box_zoom,reset,tap,save,box_select,poly_select,lasso_select"
#RGB颜色,画布1,绘图1
colors2=["#%02x%02x%02x"%(int(r),int(g),150)forr,ginzip(50+2*x,30+2*y)]
p1=figure(width=300,height=300,tools=TOOLS)
p1.scatter(x,y,radius=radii,fill_color=colors2,fill_alpha=0.6,line_color=None)
#RGB颜色,画布2,绘图2
colors2=["#%02x%02x%02x"%(150,int(g),int(b))forg,binzip(50+2*x,30+2*y)]
p2=figure(width=300,height=300,tools=TOOLS)
p2.scatter(x,y,radius=radii,fill_color=colors2,fill_alpha=0.6,line_color=None)
#直接显示
#show(p1)
#show(p2)
#网格显示
frombokeh.layoutsimportgridplot
grid=gridplot([[p1,p2]])
show(grid)
运转结果如图4所示。
▲图4 代码示例②运转结果

代码示例②中第11行和第15行运用scatter方法举行散点图绘制。第7行东西条中的差别东西定义,第9行数据点的差别颜色定义,第20行和第21行采用网格显示图形,可以提前了解这些本领,精细运用方法下文中会特别举行先容。

代码示例③
frombokeh.sampledata.irisimportflowers
#配色
colormap={'setosa':'red','versicolor':'green','virginica':'blue'}
colors=[colormap[x]forxinflowers['species']]
#画布
p=figure(title="IrisMorphology")
#绘图
p.circle(flowers["petal_length"],flowers["petal_width"],
color=colors,fill_alpha=0.2,size=10)
#其他
p.xaxis.axis_label='PetalLength'
p.yaxis.axis_label='PetalWidth'
#显示
show(p) 

运转结果如图5所示。

代码示例③再次对前面提到的鸢尾花的数据集举行剖析,图5中x轴为花瓣长度,y轴为花瓣宽度,据此可以将该散点数据聚类为3类。同时,该段代码展现了常规图形的绘制流程,含x、y轴的标签。
▲图5 代码示例③运转结果

代码示例④
frombokeh.layoutsimportcolumn,gridplot
frombokeh.modelsimportBoxSelectTool,Div
#数据
x=np.linspace(0,4*np.pi,100)
y=np.sin(x)
#东西条
TOOLS="wheel_zoom,save,box_select,lasso_select,reset"
#HTML代码
div=Div(text="""
<p>Bokeh中的画布可通过众种构造方法举行显示;</p>
<p>通过配备参数BoxSelectTool,图顶用鼠标挑选数据,采用差别方法举行交互。</p>
""")#HTML代码直接举措一个图层显示,也可以举措通通HTML文档
#视图属性
opts=dict(tools=TOOLS,plot_width=350,plot_height=350)
#绘图1
p1=figure(title="selectiononmouseup",**opts)
p1.circle(x,y,color="navy",size=6,alpha=0.6)
#绘图2
p2=figure(title="selectiononmousemove",**opts)
p2.square(x,y,color="olive",size=6,alpha=0.6)
p2.select_one(BoxSelectTool).select_every_mousemove=True
#绘图3
p3=figure(title="defaulthighlight",**opts)
p3.circle(x,y,color="firebrick",alpha=0.5,size=6)
#绘图4
p4=figure(title="customhighlight",**opts)
p4.square(x,y,color="navy",size=6,alpha=0.6,
nonselection_color="orange",nonselection_alpha=0.6)
#构造
layout=column(div,
gridplot([[p1,p2],[p3,p4]],toolbar_location="right"),
sizing_mode="scale_width")#sizing_mode依据窗口宽度缩放图像
#绘图
show(layout)



Bokeh中的画布可通过众种构造方法举行显示:通过配备视图参数,视图中举行交互可视化。运转结果如图6所示。
▲图6 代码示例④运转结果

代码示例④让读者感觉一下Bokeh的交互效果,Div方法可以直接运用HTML标签,其举措一个独立的图层举行显示(第30行)。另外需求当心,可以通过`nonselection_`,`nonselection_alpha`或`nonselection_fill_alpha`设套索置采纳数据时的散点的颜色、透后度等。

代码示例⑤

frombokeh.modelsimport(
ColumnDataSource,
Range1d,DataRange1d,
LinearAxis,SingleIntervalTicker,FixedTicker,
Label,Arrow,NormalHead,
HoverTool,TapTool,CustomJS)
frombokeh.sampledata.sprintimportsprint
abbrev_to_country={
"USA":"UnitedStates",
"GBR":"Britain",
"JAM":"Jamaica",
"CAN":"Canada",
"TRI":"TrinidadandTobago",
"AUS":"Australia",
"GER":"Germany",
"CUB":"Cuba",
"NAM":"Namibia",
"URS":"SovietUnion",
"BAR":"Barbados",
"BUL":"Bulgaria",
"HUN":"Hungary",
"NED":"Netherlands",
"NZL":"NewZealand",
"PAN":"Panama",
"POR":"Portugal",
"RSA":"SouthAfrica",
"EUA":"UnitedTeamofGermany",
}
gold_fill="#efcf6d"
gold_line="#c8a850"
silver_fill="#cccccc"
silver_line="#b0b0b1"
bronze_fill="#c59e8a"
bronze_line="#98715d"
fill_color={"gold":gold_fill,"silver":silver_fill,"bronze":bronze_fill}
line_color={"gold":gold_line,"silver":silver_line,"bronze":bronze_line}
defselected_name(name,medal,year):
returnnameifmedal=="gold"andyearin[1988,1968,1936,1896]else""
t0=sprint.Time[0]
sprint["Abbrev"]=sprint.Country
sprint["Country"]=sprint.Abbrev.map(lambdaabbr:abbrev_to_country[abbr])
sprint["Medal"]=sprint.Medal.map(lambdamedal:medal.lower())
sprint["Speed"]=100.0/sprint.Time
sprint["MetersBack"]=100.0*(1.0-t0/sprint.Time)
sprint["MedalFill"]=sprint.Medal.map(lambdamedal:fill_color[medal])
sprint["MedalLine"]=sprint.Medal.map(lambdamedal:line_color[medal])
sprint["SelectedName"]=sprint[["Name","Medal","Year"]].apply(tuple,axis=1).map(lambdaargs:selected_name(*args))
source=ColumnDataSource(sprint)
xdr=Range1d(start=sprint.MetersBack.max()+2,end=0)#XXX:+2ispoor-man'spadding(otherwisemisseslasttick)
ydr=DataRange1d(range_padding=4,range_padding_units="absolute")
plot=figure(
x_range=xdr,y_range=ydr,
plot_width=1000,plot_height=600,
toolbar_location=None,
outline_line_color=None,y_axis_type=None)
plot.title.text="UsainBoltvs.116yearsofOlympicsprinters"
plot.title.text_font_size="14pt"
plot.xaxis.ticker=SingleIntervalTicker(interval=5,num_minor_ticks=0)
plot.xaxis.axis_line_color=None
plot.xaxis.major_tick_line_color=None
plot.xgrid.grid_line_dash="dashed"
yticker=FixedTicker(ticks=[1900,1912,1924,1936,1952,1964,1976,1988,2000,2012])
yaxis=LinearAxis(ticker=yticker,major_tick_in=-5,major_tick_out=10)
plot.add_layout(yaxis,"right")
medal=plot.circle(x="MetersBack",y="Year",radius=dict(value=5,units="screen"),
fill_color="MedalFill",line_color="MedalLine",fill_alpha=0.5,source=source,level="overlay")
plot.text(x="MetersBack",y="Year",x_offset=10,y_offset=-5,text="SelectedName",
text_align="left",text_baseline="middle",text_font_size="9pt",source=source)
no_olympics_label=Label(
x=7.5,y=1942,
text="NoOlympicsin1940or1944",
text_align="center",text_baseline="middle",
text_font_size="9pt",text_font_style="italic",text_color="silver")
no_olympics=plot.add_layout(no_olympics_label)
x=sprint[sprint.Year==1900].MetersBack.min()-0.5
arrow=Arrow(x_start=x,x_end=5,y_start=1900,y_end=1900,start=NormalHead(fill_color="black",size=6),end=None,line_width=1.5)
plot.add_layout(arrow)
meters_back=Label(
x=5,x_offset=10,y=1900,
text="Metersbehind2012Bolt",
text_align="left",text_baseline="middle",
text_font_size="10pt",text_font_style="bold")
plot.add_layout(meters_back)
disclaimer=Label(
x=0,y=0,x_units="screen",y_units="screen",
text="ThischartincludesmedalsfortheUnitedStatesandAustraliainthe\"Intermediary\"Gamesof1906,whichtheI.O.C.doesnotformallyrecognize.",
text_font_size="8pt",text_color="silver")
plot.add_layout(disclaimer,"below")
tooltips="""
<div>
<spanstyle="font-size:15px;">@Name</span>
<spanstyle="font-size:10px;color:#666;">(@Abbrev)</span>
</div>
<div>
<spanstyle="font-size:17px;font-weight:bold;">@Time{0.00}</span>
<spanstyle="font-size:10px;color:#666;">@Year</span>
</div>
<divstyle="font-size:11px;color:#666;">@{MetersBack}{0.00}metersbehind</div>
"""
plot.add_tools(HoverTool(tooltips=tooltips,renderers=[medal]))
open_url=CustomJS(args=dict(source=source),code="""
source.inspected._1d.indices.forEach(function(index){
varname=source.data["Name"][index];
varurl="http://en.wikipedia.org/wiki/"+encodeURIComponent(name);
window.open(url);
});
""")
plot.add_tools(TapTool(callback=open_url,renderers=[medal],behavior="inspect"))
show(plot)


运转结果如图7所示。
▲图7 代码示例⑤运转结果

代码示例⑤展现了短跑选手博尔特与116年来奥运会其他短跑选手效果的比照状况。上述代码包罗数据预处理、自定义绘图属性、数据标记、交互式显示等较为繁杂的操作,不举措本文要点;读者仅需求晓得通过哪些代码可以完成哪些可视化的效果即可。

本文通过5个代码示例展现了散点图的绘制本领,绘制难度也渐渐增大,与此同时,展现的效果也越来越好。读者进修进程中可以众考虑,这个示例中哪些数据需求交互式展现,采用哪种展现方法更好。
首页

135editor.com">

关于作家:屈希峰,资深Python工程师,Bokeh范畴的实行者和传教者,对Bokeh有深化的研讨。擅长Flask、MongoDB、Sklearn等技能,实行体验丰厚。知乎众个专栏(Python中文社区、Python顺序员、大数据剖析开掘)作家,专栏累计体恤用户十余万人。

本文摘编自《Python数据可视化:基于Bokeh的可视化绘图》,经出书方授权发布。

THU数据派
THU数据派

THU数据派"基于清华,放眼天下",以结实的理工功底闯荡“数据江湖”。发布举世大数据资讯,按期构造线下运动,分享前沿财产动态。了解清华大数据,敬请体恤姐妹号“数据派THU”。

工程散点图代码数据可视化Python
2
相关数据
数据剖析技能

数据剖析是一类统计方法,其主要特性是众维性和描画性。有些几何方法有帮于揭示差别的数据之间保管的联系,并绘制出统计新闻图,以更简明的标明这些数据中包罗的主要新闻。其他少许用于搜罗数据,以便弄清哪些是同质的,从而更好地了解数据。 数据剖析可以处理大宗数据,并确定这些数据最有用的部分。

参数技能

数学和统计学裡,参数(英语:parameter)是运用通用变量来修立函数和变量之间联系(岛镶种联系很难用方程来阐述时)的一个数目。

回归剖析技能

回归剖析是一种用于估量变量之间的联系(当一个自变量改造而其它变量固准时,因变量会怎样改造)的统计进程,预测义务中有广泛的运用。回归剖析模子有差别的品种,此中最风行的是线性回归和 逻辑回归(Logistic Regression)。另外另有众变量回归、泊松回归、逐渐回归、脊回归(Ridge Regression)、套索回归(Lasso Regression)和众项式回归等等。随机梯度下降(SGD)便是一种根源于回归剖析的常用方法,可用于掌握繁杂度。

聚类技能

将物理或笼统对象的汇合分成由相似的对象构成的众个类的进程被称为聚类。由聚类所生成的簇是一组数据对象的汇合,这些对象与同一个簇中的对象互相相似,与其他簇中的对象相异。“物以类聚,人以群分”,自然科学和社会科学中,保管着大宗的分类题目。聚类剖析又称群剖析,它是研讨(样品或目标)分类题目的一种统计剖析方法。聚类剖析根源于分类学,可是聚类不等于分类。聚类与分类的差别于,聚类所请求划分的类是未知的。聚类剖析实质十分丰厚,有系统聚类法、有序样品聚类法、动态聚类法、模糊聚类法、图论聚类法、聚类预告法等。

知乎机构

举措中文互联网归纳性鼻槭平台,知乎将AI广泛运用与社区,构修了人、实质之间的众元连接,晋升了社区的运转服从和用户体验。知乎通过实质生产、分发,社区办理等范畴的AI运用,也创制了独有的技能优势和社区AI立异样本。

https://www.zhihu.com
数据可视化技能

数据可视化被许众学科视为当代视觉传达的等价物。为了分明有用地转达新闻,数据可视化运用统计图形、图外、新闻图和其他东西。数字数据可以运用点、线或条编码,以视觉传达定量新闻。有用的可视化帮帮用户对数据举行剖析和推理。它使繁杂的数据更容易了解和运用。用户可以依据特定的剖析义务举行数据可视化,比如举行比较或了解因果联系,而且图形的计划准绳(即,显示比较或显示因果联系)来举行可视化。外一般用于用户查找特定测量的地方,而各品种型的图外用于显示一个或众个变量的数据中的方式或联系。

暂无评论
暂无评论~