作者:lemonbit fromUnsplashbyMikeEnerio 翻译Lemon 来源MachineLearningPlus 23直方密度线图(DensityCurveswithHistogram) 带有直方图的密度曲线汇集了两个图所传达的集体信息,因此您可以将它们放在一个图中而不是两个图中。 ImportData dfpd。readcsv(https:github。comselva86datasetsrawmastermpgggplot2。csv) DrawPlot plt。figure(figsize(13,10),dpi80) sns。distplot(df。loc〔df〔class〕compact,cty〕,colordodgerblue,labelCompact,histkws{alpha:。7},kdekws{linewidth:3}) sns。distplot(df。loc〔df〔class〕suv,cty〕,colororange,labelSUV,histkws{alpha:。7},kdekws{linewidth:3}) sns。distplot(df。loc〔df〔class〕minivan,cty〕,colorg,labelminivan,histkws{alpha:。7},kdekws{linewidth:3}) plt。ylim(0,0。35) Decoration plt。title(DensityPlotofCityMileagebyVehicleType,fontsize22) plt。legend() plt。show() 图23 24JoyPlot JoyPlot允许不同组的密度曲线重叠,这是一种可视化大量分组数据的彼此关系分布的好方法。它看起来很悦目,并清楚地传达了正确的信息。它可以使用基于matplotlib的joypy包轻松构建。(Python数据之道注:需要安装joypy库) !pipinstalljoypy Python数据之道备注 importjoypy ImportData mpgpd。readcsv(https:github。comselva86datasetsrawmastermpgggplot2。csv) DrawPlot plt。figure(figsize(16,10),dpi80) fig,axesjoypy。joyplot(mpg,column〔hwy,cty〕,byclass,ylimown,figsize(14,10)) Decoration plt。title(JoyPlotofCityandHighwayMileagebyClass,fontsize22) plt。show() 图24 25分布式包点图(DistributedDotPlot) 分布式包点图显示按组分割的点的单变量分布。点数越暗,该区域的数据点集中度越高。通过对中位数进行不同着色,组的真实定位立即变得明显。 图25 26箱形图(BoxPlot) 箱形图是一种可视化分布的好方法,记住中位数、第25个第45个四分位数和异常值。但是,您需要注意解释可能会扭曲该组中包含的点数的框的大小。因此,手动提供每个框中的观察数量可以帮助克服这个缺点。 例如,左边的前两个框具有相同大小的框,即使它们的值分别是5和47。因此,写入该组中的观察数量是必要的。 ImportData dfpd。readcsv(https:github。comselva86datasetsrawmastermpgggplot2。csv) DrawPlot plt。figure(figsize(13,10),dpi80) sns。boxplot(xclass,yhwy,datadf,notchFalse) AddNObsinsideboxplot(optional) defaddnobs(df,groupcol,y): mediansdict{grp〔0〕:grp〔1〕〔y〕。median()forgrpindf。groupby(groupcol)} xticklabels〔x。gettext()forxinplt。gca()。getxticklabels()〕 nobsdf。groupby(groupcol)〔y〕。size()。values for(x,xticklabel),nobinzip(enumerate(xticklabels),nobs): plt。text(x,mediansdict〔xticklabel〕1。01,obs:str(nob),horizontalalignmentcenter,fontdict{size:14},colorwhite) addnobs(df,groupcolclass,yhwy) Decoration plt。title(BoxPlotofHighwayMileagebyVehicleClass,fontsize22) plt。ylim(10,40) plt。show() 图26 27包点箱形图(DotBoxPlot) 包点箱形图(DotBoxPlot)传达类似于分组的箱形图信息。此外,这些点可以了解每组中有多少数据点。 ImportData dfpd。readcsv(https:github。comselva86datasetsrawmastermpgggplot2。csv) DrawPlot plt。figure(figsize(13,10),dpi80) sns。boxplot(xclass,yhwy,datadf,huecyl) sns。stripplot(xclass,yhwy,datadf,colorblack,size3,jitter1) foriinrange(len(df〔class〕。unique())1): plt。vlines(i。5,10,45,linestylessolid,colorsgray,alpha0。2) Decoration plt。title(BoxPlotofHighwayMileagebyVehicleClass,fontsize22) plt。legend(titleCylinders) plt。show() 图27 28小提琴图(ViolinPlot) 小提琴图是箱形图在视觉上令人愉悦的替代品。小提琴的形状或面积取决于它所持有的观察次数。但是,小提琴图可能更难以阅读,并且在专业设置中不常用。 ImportData dfpd。readcsv(https:github。comselva86datasetsrawmastermpgggplot2。csv) DrawPlot plt。figure(figsize(13,10),dpi80) sns。violinplot(xclass,yhwy,datadf,scalewidth,innerquartile) Decoration plt。title(ViolinPlotofHighwayMileagebyVehicleClass,fontsize22) plt。show() 图28 29人口金字塔(PopulationPyramid) 人口金字塔可用于显示由数量排序的组的分布。或者它也可以用于显示人口的逐级过滤,因为它在下面用于显示有多少人通过营销渠道的每个阶段。 Readdata dfpd。readcsv(https:raw。githubusercontent。comselva86datasetsmasteremailcampaignfunnel。csv) DrawPlot plt。figure(figsize(13,10),dpi80) groupcolGender orderofbarsdf。Stage。unique()〔::1〕 colors〔plt。cm。Spectral(ifloat(len(df〔groupcol〕。unique())1))foriinrange(len(df〔groupcol〕。unique()))〕 forc,groupinzip(colors,df〔groupcol〕。unique()): sns。barplot(xUsers,yStage,datadf。loc〔df〔groupcol〕group,:〕,orderorderofbars,colorc,labelgroup) Decorations plt。xlabel(Users) plt。ylabel(StageofPurchase) plt。yticks(fontsize12) plt。title(PopulationPyramidoftheMarketingFunnel,fontsize22) plt。legend() plt。show() 图29 30分类图(CategoricalPlots) 由seaborn库提供的分类图可用于可视化彼此相关的2个或更多分类变量的计数分布。 LoadDataset titanicsns。loaddataset(titanic) Plot gsns。catplot(alive,coldeck,colwrap4, datatitanic〔titanic。deck。notnull()〕, kindcount,height3。5,aspect。8, palettetab20) fig。suptitle(sf) plt。show() 图30 LoadDataset titanicsns。loaddataset(titanic) Plot sns。catplot(xage,yembarktown, huesex,colclass, datatitanic〔titanic。embarktown。notnull()〕, orienth,height5,aspect1,palettetab10, kindviolin,dodgeTrue,cut0,bw。2) 图302 五、组成(Composition)31华夫饼图(WaffleChart) 可以使用pywaffle包创建华夫饼图,并用于显示更大群体中的组的组成。 (Python数据之道注:需要安装pywaffle库) !pipinstallpywaffle Reference:https:stackoverflow。comquestions41400136howtodowafflechartsinpythonsquarepiechart frompywaffleimportWaffle Import dfrawpd。readcsv(https:github。comselva86datasetsrawmastermpgggplot2。csv) PrepareData dfdfraw。groupby(class)。size()。resetindex(namecounts) ncategoriesdf。shape〔0〕 colors〔plt。cm。infernor(ifloat(ncategories))foriinrange(ncategories)〕 DrawPlotandDecorate figplt。figure( FigureClassWaffle, plots{ 111:{ values:df〔counts〕, labels:〔{0}({1})。format(n〔0〕,n〔1〕)fornindf〔〔class,counts〕〕。itertuples()〕, legend:{loc:upperleft,bboxtoanchor:(1。05,1),fontsize:12}, title:{label:VehiclesbyClass,loc:center,fontsize:18} }, }, rows7, colorscolors, figsize(16,9) ) 图31 图312 32饼图(PieChart) 饼图是显示组成的经典方式。然而,现在通常不建议使用它,因为馅饼部分的面积有时会变得误导。因此,如果您要使用饼图,强烈建议明确记下饼图每个部分的百分比或数字。 Import dfrawpd。readcsv(https:github。comselva86datasetsrawmastermpgggplot2。csv) PrepareData dfdfraw。groupby(class)。size() Maketheplotwithpandas df。plot(kindpie,subplotsTrue,figsize(8,8)) plt。title(PieChartofVehicleClassBad) plt。ylabel() plt。show() 图32 图322 33树形图(Treemap) 树形图类似于饼图,它可以更好地完成工作而不会误导每个组的贡献。 (Python数据之道注:需要安装squarify库) pipinstallsquarify importsquarify ImportData dfrawpd。readcsv(https:github。comselva86datasetsrawmastermpgggplot2。csv) PrepareData dfdfraw。groupby(class)。size()。resetindex(namecounts) labelsdf。apply(lambdax:str(x〔0〕) (str(x〔1〕)),axis1) sizesdf〔counts〕。values。tolist() colors〔plt。cm。Spectral(ifloat(len(labels)))foriinrange(len(labels))〕 DrawPlot plt。figure(figsize(12,8),dpi80) squarify。plot(sizessizes,labellabels,colorcolors,alpha。8) Decorate plt。title(TreemapofVechileClass) plt。axis(off) plt。show() 图33 34条形图(BarChart) 条形图是基于计数或任何给定指标可视化项目的经典方式。在下面的图表中,我为每个项目使用了不同的颜色,但您通常可能希望为所有项目选择一种颜色,除非您按组对其进行着色。颜色名称存储在下面代码中的allcolors中。您可以通过在plt。plot()中设置颜色参数来更改条的颜色。 importrandom ImportData dfrawpd。readcsv(https:github。comselva86datasetsrawmastermpgggplot2。csv) PrepareData dfdfraw。groupby(manufacturer)。size()。resetindex(namecounts) ndf〔manufacturer〕。unique()。len()1 allcolorslist(plt。cm。colors。cnames。keys()) random。seed(100) crandom。choices(allcolors,kn) PlotBars plt。figure(figsize(16,10),dpi80) plt。bar(df〔manufacturer〕,df〔counts〕,colorc,width。5) fori,valinenumerate(df〔counts〕。values): plt。text(i,val,float(val),horizontalalignmentcenter,verticalalignmentbottom,fontdict{fontweight:500,size:12}) Decoration plt。gca()。setxticklabels(df〔manufacturer〕,rotation60,horizontalalignmentright) plt。title(NumberofVehiclesbyManaufacturers,fontsize22) plt。ylabel(Vehicles) plt。ylim(0,45) plt。show() 图34 六、变化(Change)35时间序列图(TimeSeriesPlot) 时间序列图用于显示给定度量随时间变化的方式。在这里,您可以看到1949年至1969年间航空客运量的变化情况。 ImportData dfpd。readcsv(https:github。comselva86datasetsrawmasterAirPassengers。csv) DrawPlot plt。figure(figsize(16,10),dpi80) plt。plot(date,traffic,datadf,colortab:red) Decoration plt。ylim(50,750) xticklocationdf。index。tolist()〔::12〕 xticklabels〔x〔4:〕forxindf。date。tolist()〔::12〕〕 plt。xticks(ticksxticklocation,labelsxticklabels,rotation0,fontsize12,horizontalalignmentcenter,alpha。7) plt。yticks(fontsize12,alpha。7) plt。title(AirPassengersTraffic(19491969),fontsize22) plt。grid(axisboth,alpha。3) Removeborders plt。gca()。spines〔top〕。setalpha(0。0) plt。gca()。spines〔bottom〕。setalpha(0。3) plt。gca()。spines〔right〕。setalpha(0。0) plt。gca()。spines〔left〕。setalpha(0。3) plt。show() 图35 36带波峰波谷标记的时序图(TimeSerieswithPeaksandTroughsAnnotated) 下面的时间序列绘制了所有峰值和低谷,并注释了所选特殊事件的发生。 图36 37自相关和部分自相关图(Autocorrelation(ACF)andPartialAutocorrelation(PACF)Plot) 自相关图(ACF图)显示时间序列与其自身滞后的相关性。每条垂直线(在自相关图上)表示系列与滞后0之间的滞后之间的相关性。图中的蓝色阴影区域是显着性水平。那些位于蓝线之上的滞后是显着的滞后。 那么如何解读呢? 对于空乘旅客,我们看到多达14个滞后跨越蓝线,因此非常重要。这意味着,14年前的航空旅客交通量对今天的交通状况有影响。 PACF在另一方面显示了任何给定滞后(时间序列)与当前序列的自相关,但是删除了滞后的贡献。 fromstatsmodels。graphics。tsaplotsimportplotacf,plotpacf ImportData dfpd。readcsv(https:github。comselva86datasetsrawmasterAirPassengers。csv) DrawPlot fig,(ax1,ax2)plt。subplots(1,2,figsize(16,6),dpi80) plotacf(df。traffic。tolist(),axax1,lags50) plotpacf(df。traffic。tolist(),axax2,lags20) Decorate lightentheborders ax1。spines〔top〕。setalpha(。3);ax2。spines〔top〕。setalpha(。3) ax1。spines〔bottom〕。setalpha(。3);ax2。spines〔bottom〕。setalpha(。3) ax1。spines〔right〕。setalpha(。3);ax2。spines〔right〕。setalpha(。3) ax1。spines〔left〕。setalpha(。3);ax2。spines〔left〕。setalpha(。3) fontsizeofticklabels ax1。tickparams(axisboth,labelsize12) ax2。tickparams(axisboth,labelsize12) plt。show() 图37 38交叉相关图(CrossCorrelationplot) 交叉相关图显示了两个时间序列相互之间的滞后。 图38 39时间序列分解图(TimeSeriesDecompositionPlot) 时间序列分解图显示时间序列分解为趋势,季节和残差分量。 fromstatsmodels。tsa。seasonalimportseasonaldecompose fromdateutil。parserimportparse ImportData dfpd。readcsv(https:github。comselva86datasetsrawmasterAirPassengers。csv) datespd。DatetimeIndex(〔parse(d)。strftime(Ym01)fordindf〔date〕〕) df。setindex(dates,inplaceTrue) Decompose resultseasonaldecompose(df〔traffic〕,modelmultiplicative) Plot plt。rcParams。update({figure。figsize:(10,10)}) result。plot()。suptitle(TimeSeriesDecompositionofAirPassengers) plt。show() 图39 40多个时间序列(MultipleTimeSeries) 您可以绘制多个时间序列,在同一图表上测量相同的值,如下所示。 图40 41使用辅助Y轴来绘制不同范围的图形(PlottingwithdifferentscalesusingsecondaryYaxis) 如果要显示在同一时间点测量两个不同数量的两个时间序列,则可以在右侧的辅助Y轴上再绘制第二个系列。 图41 42带有误差带的时间序列(TimeSerieswithErrorBands) 如果您有一个时间序列数据集,每个时间点(日期时间戳)有多个观测值,则可以构建带有误差带的时间序列。您可以在下面看到一些基于每天不同时间订单的示例。另一个关于45天持续到达的订单数量的例子。 在该方法中,订单数量的平均值由白线表示。并且计算95置信区间并围绕均值绘制。 图42 图422 43堆积面积图(StackedAreaChart) 堆积面积图可以直观地显示多个时间序列的贡献程度,因此很容易相互比较。 图43 44未堆积的面积图(AreaChartUnStacked) 未堆积面积图用于可视化两个或更多个系列相对于彼此的进度(起伏)。在下面的图表中,您可以清楚地看到随着失业中位数持续时间的增加,个人储蓄率会下降。未堆积面积图表很好地展示了这种现象。 ImportData dfpd。readcsv(https:github。comselva86datasetsrawmastereconomics。csv) PrepareData xdf〔date〕。values。tolist() y1df〔psavert〕。values。tolist() y2df〔uempmed〕。values。tolist() mycolors〔tab:red,tab:blue,tab:green,tab:orange,tab:brown,tab:grey,tab:pink,tab:olive〕 columns〔psavert,uempmed〕 DrawPlot fig,axplt。subplots(1,1,figsize(16,9),dpi80) ax。fillbetween(x,y1y1,y20,labelcolumns〔1〕,alpha0。5,colormycolors〔1〕,linewidth2) ax。fillbetween(x,y1y2,y20,labelcolumns〔0〕,alpha0。5,colormycolors〔0〕,linewidth2) Decorations ax。settitle(PersonalSavingsRatevsMedianDurationofUnemployment,fontsize18) ax。set(ylim〔0,30〕) ax。legend(locbest,fontsize12) plt。xticks(x〔::50〕,fontsize10,horizontalalignmentcenter) plt。yticks(np。arange(2。5,30。0,2。5),fontsize10) plt。xlim(10,x〔1〕) DrawTicklines foryinnp。arange(2。5,30。0,2。5): plt。hlines(y,xmin0,xmaxlen(x),colorsblack,alpha0。3,linestyles,lw0。5) Lightenborders plt。gca()。spines〔top〕。setalpha(0) plt。gca()。spines〔bottom〕。setalpha(。3) plt。gca()。spines〔right〕。setalpha(0) plt。gca()。spines〔left〕。setalpha(。3) plt。show() 图44 45日历热力图(CalendarHeatMap) 与时间序列相比,日历地图是可视化基于时间的数据的备选和不太优选的选项。虽然可以在视觉上吸引人,但数值并不十分明显。然而,它可以很好地描绘极端值和假日效果。 (Python数据之道注:需要安装calmap库) importmatplotlibasmpl pipinstallcalmap Python数据之道备注 importcalmap ImportData dfpd。readcsv(https:raw。githubusercontent。comselva86datasetsmasteryahoo。csv,parsedates〔date〕) df。setindex(date,inplaceTrue) Plot plt。figure(figsize(16,10),dpi80) calmap。calendarplot(df〔2014〕〔VIX。Close〕,figkws{figsize:(16,10)},yearlabelkws{color:black,fontsize:14},subplotkws{title:YahooStockPrices}) plt。show() 图45 46季节图(SeasonalPlot) 季节图可用于比较上一季中同一天(年月周等)的时间序列。 图46 七、分组(Groups)47树状图(Dendrogram) 树形图基于给定的距离度量将相似的点组合在一起,并基于点的相似性将它们组织在树状链接中。 importscipy。cluster。hierarchyasshc ImportData dfpd。readcsv(https:raw。githubusercontent。comselva86datasetsmasterUSArrests。csv) Plot plt。figure(figsize(16,10),dpi80) plt。title(USArrestsDendograms,fontsize22) dendshc。dendrogram(shc。linkage(df〔〔Murder,Assault,UrbanPop,Rape〕〕,methodward),labelsdf。State。values,colorthreshold100) plt。xticks(fontsize12) plt。show() 图47 48簇状图(ClusterPlot) 簇状图(ClusterPlot)可用于划分属于同一群集的点。下面是根据USArrests数据集将美国各州分为5组的代表性示例。此图使用“谋杀”和“攻击”列作为X和Y轴。或者,您可以将第一个到主要组件用作X轴和Y轴。 fromsklearn。clusterimportAgglomerativeClustering fromscipy。spatialimportConvexHull ImportData dfpd。readcsv(https:raw。githubusercontent。comselva86datasetsmasterUSArrests。csv) AgglomerativeClustering clusterAgglomerativeClustering(nclusters5,affinityeuclidean,linkageward) cluster。fitpredict(df〔〔Murder,Assault,UrbanPop,Rape〕〕) Plot plt。figure(figsize(14,10),dpi80) plt。scatter(df。iloc〔:,0〕,df。iloc〔:,1〕,ccluster。labels,cmaptab10) Encircle defencircle(x,y,axNone,kw): ifnotax:axplt。gca() pnp。c〔x,y〕 hullConvexHull(p) polyplt。Polygon(p〔hull。vertices,:〕,kw) ax。addpatch(poly) Drawpolygonsurroundingvertices encircle(df。loc〔cluster。labels0,Murder〕,df。loc〔cluster。labels0,Assault〕,eck,fcgold,alpha0。2,linewidth0) encircle(df。loc〔cluster。labels1,Murder〕,df。loc〔cluster。labels1,Assault〕,eck,fctab:blue,alpha0。2,linewidth0) encircle(df。loc〔cluster。labels2,Murder〕,df。loc〔cluster。labels2,Assault〕,eck,fctab:red,alpha0。2,linewidth0) encircle(df。loc〔cluster。labels3,Murder〕,df。loc〔cluster。labels3,Assault〕,eck,fctab:green,alpha0。2,linewidth0) encircle(df。loc〔cluster。labels4,Murder〕,df。loc〔cluster。labels4,Assault〕,eck,fctab:orange,alpha0。2,linewidth0) Decorations plt。xlabel(Murder);plt。xticks(fontsize12) plt。ylabel(Assault);plt。yticks(fontsize12) plt。title(AgglomerativeClusteringofUSArrests(5Groups),fontsize22) plt。show() 图48 49安德鲁斯曲线(AndrewsCurve) 安德鲁斯曲线有助于可视化是否存在基于给定分组的数字特征的固有分组。如果要素(数据集中的列)无法区分组(cyl),那么这些线将不会很好地隔离,如下所示。 frompandas。plottingimportandrewscurves Import dfpd。readcsv(https:github。comselva86datasetsrawmastermtcars。csv) df。drop(〔cars,carname〕,axis1,inplaceTrue) Plot plt。figure(figsize(12,9),dpi80) andrewscurves(df,cyl,colormapSet1) Lightenborders plt。gca()。spines〔top〕。setalpha(0) plt。gca()。spines〔bottom〕。setalpha(。3) plt。gca()。spines〔right〕。setalpha(0) plt。gca()。spines〔left〕。setalpha(。3) plt。title(AndrewsCurvesofmtcars,fontsize22) plt。xlim(3,3) plt。grid(alpha0。3) plt。xticks(fontsize12) plt。yticks(fontsize12) plt。show() 图49 50平行坐标(ParallelCoordinates) 平行坐标有助于可视化特征是否有助于有效地隔离组。如果实现隔离,则该特征可能在预测该组时非常有用。 frompandas。plottingimportparallelcoordinates ImportData dffinalpd。readcsv(https:raw。githubusercontent。comselva86datasetsmasterdiamondsfilter。csv) Plot plt。figure(figsize(12,9),dpi80) parallelcoordinates(dffinal,cut,colormapDark2) Lightenborders plt。gca()。spines〔top〕。setalpha(0) plt。gca()。spines〔bottom〕。setalpha(。3) plt。gca()。spines〔right〕。setalpha(0) plt。gca()。spines〔left〕。setalpha(。3) plt。title(ParallelCoordinatedofDiamonds,fontsize22) plt。grid(alpha0。3) plt。xticks(fontsize12) plt。yticks(fontsize12) plt。show() 图50