数据可视化是数据科学家工作的重要组成部分。在项目的早期阶段,您通常会进行探索性数据分析(EDA)以对数据有一些了解。创建可视化效果确实有助于让事情更容易理解,尤其是对于大型、高维数据集。在项目结束时,以清晰、简洁和引人注目的方式呈现最终结果非常重要,因为您的听众通常是非技术客户,只有这样他们才能理解。Matplotlib是一个流行的Python库,可用于轻松创建数据可视化解决方案。但是每次创建一个新项目,设置数据、参数、图形和布局就变得非常繁琐和麻烦。在这篇博文中,我们将介绍5种数据可视化方法,并使用PythonMatplotlib为它们编写一些快速简单的函数。与此同时,这里有一张很棒的图表,可以帮助您为您的工作选择正确的可视化方法!散点图非常适合显示两个变量之间的关系,因为您可以直接看到数据的原始分布。您还可以通过简单地对组进行颜色编码来查看不同数据组之间的关系,如下面的第一张图片所示。想可视化三个变量之间的关系?没问题!第三个变量可以通过简单地使用另一个参数(例如点大小)进行编码,如下面的第二张图片所示。现在来看代码。我们先导入Matplotlib的pyplot,别名为“plt”。要创建新图,我们调用plt.subplots()。我们将x轴和y轴数据传递给这个函数,然后将这些数据传递给ax.scatter()来绘制散点图。我们还可以设置点大小、点颜色和alpha透明度。您甚至可以将Y轴设置为对数刻度。轴上的标题和标签可以专门为绘图设置。这是一个易于使用的函数,可用于从头到尾创建散点图!importmatplotlib.pyplotaspltimportnumpyasnpdefscatterplot(x_data,y_data,x_label="",y_label="",title="",color="r",yscale_log=False):#Createtheplotobject_,ax=plt.subplots()#Plotthedata,setthesize(s)),colorandtransparency(alpha)#ofthepointsax.scatter(x_data,y_data,s=10,color=color,alpha=0.75)ifyscale_log==True:ax.set_yscale('log')#Labeltheaxesandprovidetitleax.set_title(标题)ax.set_xlabel(x_label)ax.set_ylabel(y_label)折线图当你可以看到一个变量与另一个变量的变化很大,比如它们有很大的协方差时,最好使用折线图。让我们看看下面的图片。我们可以清楚地看到所有主线随时间发生的大量变化。用散点图绘制这些会非常混乱,很难真正理解和看到发生了什么。折线图非常适合这种情况,因为它们基本上为我们提供了两个变量(百分比和时间)协方差的快速总结。或者,我们也可以按颜色编码进行分组。这是折线图的代码。它与上面的散点图非常相似,一些变量的变化很小。deflineplot(x_data,y_data,x_label="",y_label="",title=""):#Createtheplotobject_,ax=plt.subplots()#Plotthebestfitline,setthelinewidth(lw),colorand#transparency(alpha)ofthelineax.plot(x_data,y_data,lw=2,color='#539caf',alpha=1)#Labeltheaxesandprovidetitleax.set_title(title)ax.set_xlabel(x_label)ax.set_ylabel(y_label)直方图直方图非常适合查看(或真正探索)数据点的分布很有用。通过下面的频率和智商查看我们的直方图。我们可以清楚地看到向中间聚集,并且可以看到中位数是多少。我们还可以看到它是正态分布的。使用直方图确实可以清楚地显示各组频率之间的相对差异。使用组(离散化)确实可以帮助我们看到“大局”,但是当我们使用没有离散组的所有数据点时,它会在可视化中产生大量噪音,从而很难看清到底发生了什么困难。下面是Matplotlib中直方图的代码。有两个参数需要注意:首先,参数n_bins控制我们想要在直方图中有多少个离散的bin。更多的组会为我们提供更完整的信息,但也可能会引入噪音,使我们远离大局;另一方面,更少的组给我们更多的“鸟瞰图”,没有更多细节的全球地图。其次,参数cumulative是一个布尔值,可以让我们选择直方图是否累积,基本上就是选择是PDF(ProbabilityDensityFunction,概率密度函数)还是CDF(CumulativeDensityFunction,累积密度函数)。defhistogram(数据,n_bins,累积=假,x_label=“”,y_label=“”,title=“”):_,ax=plt.subplots()ax.hist(数据,n_bins=n_bins,累积=累积,颜色='#539caf')ax.set_ylabel(y_label)ax.set_xlabel(x_label)ax.set_title(title)假设我们想要比较数据中两个变量的分布。有人可能认为您必须制作两个直方图并将它们并排比较。然而,其实还有更好的方法:我们可以将不同不透明度的直方图叠加起来。看下图,均匀分布的透明度设置为0.5,这样我们就可以看到他身后的图形了。这样我们就可以在同一张图中直接看到两种分布。对于重叠直方图,需要设置一些内容。首先,我们设置横轴的范围以同时适应不同的分布。从这个范围和想要的组数,我们其实可以计算出每个组的宽度。***,我们在同一张图上绘制了两个直方图,其中一个稍微透明一些。#Overlay2histogramstocomparethemdefoverlaid_histogram(data1,data2,n_bins=0,data1_name="",data1_color="#539caf",data2_name="",data2_color="#7663b0",x_label="",y_label="",title=""):#Settheboundsforthebinssothatthetwodistributionssarefairlycomparedmax_nbins=10data_range=[min(min(data1),min(data2)),max(max(data1),max(data2))]binwidth=(data_range[1]-data_range[0])/max_nbinsifn_bins==0bins=np.arange(data_range[0],data_range[1]+binwidth,binwidth)else:bins=n_bins#Createtheplot_,ax=plt.subplots()ax.hist(data1,bins=bins,color=data1_color,alpha=1,label=data1_name)ax.hist(data2,bins=bins,color=data2_color,alpha=0.75,label=data2_name)ax.set_ylabel(y_label)ax.set_xlabel(x_label)ax.set_title(标题)ax.legend(loc='best')直方图当您尝试可视化类别很少(可能少于10个)的分类数据时,直方图最有效。如果我们有太多的类别,那么这些直方图就会非常混乱并且难以理解。直方图非常适合分类数据,因为您可以很容易地看到基于列的类别之间的差异(例如大小);类别也很容易划分和颜色代码。我们将查看三种不同类型的直方图:常规、分组和堆叠。随着我们的进行,请检查图形下方的代码。传统的直方图如下图1所示。在barplot()函数中,xdata表示x轴上的标记,ydata表示y轴上条形的高度。误差条是一条以每个条为中心的额外线,用于绘制标准差。分组直方图允许我们比较多个分类变量。请看下面的图2。我们比较的第一个变量是分数如何在各组之间变化(组是G1、G2等)。我们也在比较性别本身和颜色代码。查看代码,y_data_list变量实际上是y元素列表的列表,其中每个子列表代表不同的组。然后我们遍历每个组,对于每个组,我们在x轴上绘制每个标记;每个组都有颜色编码。堆叠直方图是可视化不同变量分类的好方法。在图3的堆积柱形图中,我们比较了每天的服务器负载。通过颜色编码的堆栈图,可以轻松查看和了解每天哪些服务器的工作量最大,以及与其他服务器相比它们的负载情况。此代码与分组条形图的代码相同。我们遍历每一组,但这次我们将新条放在旧条的顶部而不是它们旁边。defbarplot(x_data,y_data,error_data,x_label="",y_label="",title=""):_,ax=plt.subplots()#Drawbars,positiontheminthecenterofthetickmarkonthex-axisax.bar(x_data,y_data,color='#539caf',align='center')#Drawerrorbarstoshowstandarddeviation,setlsto'none'#toremovelinebetweenpointsax.errorbar(x_data,y_data,yerr=error_data,color='#297083',ls='none',lw=2,capthick=2)ax.set_ylabel(y_label)ax.set_xlabel(x_label)ax.set_title(title)defstackedbarplot(x_data,y_data_list,colors,y_data_names="",x_label="",y_label="",title=""):_,ax=plt.subplots()#Drawbars,onecategoryatatimeforiinrange(0,len(y_data_list)):ifi==0:ax.bar(x_data,y_data_list[i],color=colors[i],align='center',label=y_data_names[i])else:#Foreachcategoryafterthefirst,thebottomofthe#barwillbethetopofthelastcategoryax.bar(x_data,y_data_list[i],color=colors[i],bottom=y_data_list[i-1],align='center',label=y_data_names[i]])ax.set_ylabel(y_label)ax.set_xlabel(x_label)ax.set_title(title)ax.legend(loc='upperright')defgroupedbarplot(x_data,y_data_list,colors,y_data_names="",x_label="",y_label="",title=""):_,ax=plt.subplots()#Totalwidthforallbarsatonexlocationtotal_width=0.8#Widthofeachindividualbarind_width=total_width/len(y_data_list)#Thiscenterseachclusterofbarsaboutthextickmarkalteration=np.arange(-(total_width/2),total_width/2,ind_width)#Drawbars,onecategory(atatime,foriinrange)len(y_data_list)):#Movethebartotherrightonthex-axissoitdoesn't#overlapwithpreviouslydrawnonesax.bar(x_data+alteration[i],y_data_list[i],color=colors[i],label=y_data_names[i],width=ind_width)ax.set_ylabel(y_label)ax.set_xlabel(x_label)ax.set_title(title)ax.legend(loc='upperright')boxplot我们前面看了直方图,它很好地可视化了变量的分布但是如果我们需要更多呢信息?也许我们想更清楚地看到标准偏差?也许中位数与平均值有很大不同,我们有很多异常值?如果有这样的偏移,很多值都聚集在一侧怎么办?这就是箱线图的用途。箱线图为我们提供了上述所有信息。实心框的底部和顶部始终是第一和第三四分位数(比如数据的25%和75%),而框中的水平线始终是第二四分位数(中位数)。须状线(虚线和拖尾条)从该框突出,显示数据的范围。由于每个组/变量的箱线图是单独绘制的,因此很容易设置。xdata是组/变量的列表。Matplotlib库的boxplot()函数为ydata中的每一列或向量绘制一个框。所以xdata中的每个值对应于ydata中的列/向量。我们想要设置的只是橱柜的美学。defboxplot(x_data,y_data,base_color="#539caf",median_color="#297083",x_label="",y_label="",title=""):_,ax=plt.subplots()#Drawboxplots,specifyingdesiredstyleax。boxplot(y_data#patch_artist必须为True才能控制boxfill,patch_artist=True#Propertiesofmedianline,medianprops={'color':median_color}#Propertiesofbox,boxprops={'color':base_color,'facecolor':base_color}#Propertiesofwhiskers,whiskerprops={'color':base_color}#Propertiesofwhiskercaps,capprops={'color':base_color})#Bydefault,thicklabelstartsat1andincrementsby1for#eachboxdrawn.Thissetsthelabelstotheoneswewantax.set_xticklabels(x_data)ax.set_ylabel(y_label)ax.set_xlabel(x_label)ax.setp_title)结论(使用一种快速简便的方法来可视化数据。将相关交易抽象成函数,总能让你的代码更易读易用!我希望您喜欢这篇文章并学到一些新的有用的技巧。如果你这样做,请随时竖起大拇指。
