数据聚合、汇总和可视化是支撑数据分析领域的三大支柱。长久以来,数据可视化都是一个强有力的工具,被业界广泛使用,却受限于2维。
在本文中,作者将探索一些有效的多维数据可视化策略(范围从1维到6维)。
一、可视化介绍
描述性分析(descriptiveanalytics)是任何分析生命周期的数据科学项目或特定研究的核心组成部分之一。数据聚合(aggregation)、汇总(summarization)和可视化(visualization)是支撑数据分析领域的主要支柱。从传统商业智能(BusinessIntelligence)开始,甚至到如今人工智能时代,数据可视化都是一个强有力的工具;由于其能有效抽取正确的信息,同时清楚容易地理解和解释结果,可视化被业界组织广泛使用。然而,处理多维数据集(通常具有2个以上属性)开始引起问题,因为我们的数据分析和通信的媒介通常限于2个维度。在本文中,我们将探索一些有效的多维数据可视化策略(范围从1维到6维)。
二、可视化动机
「一图胜千言」
「一张图片的最大价值在于,它迫使我们注意到我们从未期望看到的东西。」——JohnTukey
三、快速回顾可视化
本文假设一般读者知道用于绘图和可视化数据的基本图表类型,因此这里不再赘述,但在本文随后的实践中,我们将会涉及大部分图表类型。著名的可视化先驱和统计学家EdwardTufte说过,数据可视化应该在数据的基础上,以清晰、精确和高效的方式传达数据模式和洞察信息。
闲话至此,我们来看看可视化(和代码)吧!
我们将首先加载以下必要的依赖包进行分析。
importpandasaspdimportmatplotlib.pyplotaspltfrommpl_toolkits.mplot3dimportAxes3Dimportmatplotlibasmplimportnumpyasnpimportseabornassns
%matplotlibinline
我们将主要使用matplotlib和seaborn作为我们的可视化框架,但你可以自由选择并尝试任何其它框架。首先进行基本的数据预处理步骤。
white_wine=pd.read_csv('winequality-white.csv',sep=';')red_wine=pd.read_csv('winequality-red.csv',sep=';')
#storewinetypeasanattributered_wine['wine_type']='red'white_wine['wine_type']='white'
#bucketwinequalityscoresintoqualitativequalitylabelsred_wine['quality_label']=red_wine['quality'].apply(lambdavalue:'low'ifvalue<=5else'medium'ifvalue<=7else'high')red_wine['quality_label']=pd.Categorical(red_wine['quality_label'],categories=['low','medium','high'])white_wine['quality_label']=white_wine['quality'].apply(lambdavalue:'low'ifvalue<=5else'medium'ifvalue<=7else'high')white_wine['quality_label']=pd.Categorical(white_wine['quality_label'],categories=['low','medium','high'])
#mergeredandwhitewinedatasetswines=pd.concat([red_wine,white_wine])
#re-shufflerecordsjusttorandomizedatapoints
wines=wines.sample(frac=1,random_state=42).reset_index(drop=True)
我们通过合并有关红、白葡萄酒样本的数据集来创建单个葡萄酒数据框架。我们还根据葡萄酒样品的质量属性创建一个新的分类变量quality_label。现在我们来看看数据前几行。
wines.head()
葡萄酒质量数据集
很明显,我们有几个葡萄酒样本的数值和分类属性。每个观测样本属于红葡萄酒或白葡萄酒样品,属性是从物理化学测试中测量和获得的特定属性或性质。如果你想了解每个属性(属性对应的变量名称一目了然)详细的解释,你可以查看JupyterNotebook。让我们快速对这些感兴趣的属性进行基本的描述性概括统计。
subset_attributes=['residualsugar','totalsulfurdioxide','sulphates','alcohol','volatileacidity','quality']rs=round(red_wine[subset_attributes].describe(),2)ws=round(white_wine[subset_attributes].describe(),2)
pd.concat([rs,ws],axis=1,keys=['RedWineStatistics','WhiteWineStatistics'])
葡萄酒类型的基本描述性统计
比较这些不同类型的葡萄酒样本的统计方法相当容易。注意一些属性的明显差异。稍后我们将在一些可视化中强调这些内容。
1.单变量分析
单变量分析基本上是数据分析或可视化的最简单形式,因为只关心分析一个数据属性或变量并将其可视化(1维)。
可视化1维数据(1-D)
使所有数值数据及其分布可视化的最快、最有效的方法之一是利用pandas画直方图(histogram)。
wines.hist(bins=15,color='steelblue',edgecolor='black',linewidth=1.0,xlabelsize=8,ylabelsize=8,grid=False)
plt.tight_layout(rect=(0,0,1.2,1.2))
上图给出了可视化任何属性的基本数据分布的一个好主意。
让我们进一步可视化其中一个连续型数值属性。直方图或核密度图能够很好地帮助理解该属性数据的分布。
#Histogramfig=plt.figure(figsize=(6,4))title=fig.suptitle("SulphatesContentinWine",fontsize=14)fig.subplots_adjust(top=0.85,wspace=0.3)
ax=fig.add_subplot(1,1,1)ax.set_xlabel("Sulphates")ax.set_ylabel("Frequency")ax.text(1.2,800,r'$\mu$='+str(round(wines['sulphates'].mean(),2)),fontsize=12)freq,bins,patches=ax.hist(wines['sulphates'],color='steelblue',bins=15,edgecolor='black',linewidth=1)
#DensityPlotfig=plt.figure(figsize=(6,4))title=fig.suptitle("SulphatesContentinWine",fontsize=14)fig.subplots_adjust(top=0.85,wspace=0.3)
ax1=fig.add_subplot(1,1,1)ax1.set_xlabel("Sulphates")ax1.set_ylabel("Frequency")sns.kdeplot(wines['sulphates'],ax=ax1,shade=True,color='steelblue')
从上面的图表中可以看出,葡萄酒中硫酸盐的分布存在明显的右偏(rightskew)。
可视化一个离散分类型数据属性稍有不同,条形图是(barplot)最有效的方法之一。你也可以使用饼图(pie-chart),但一般来说要尽量避免,尤其是当不同类别的数量超过3个时。
ax1=fig.add_subplot(1,1,1)ax1.set_xlabel("Sulphates")ax1.set_ylabel("Frequency")
sns.kdeplot(wines['sulphates'],ax=ax1,shade=True,color='steelblue')
现在我们继续分析更高维的数据。
2.多变量分析
可视化2维数据(2-D)
#CorrelationMatrixHeatmapf,ax=plt.subplots(figsize=(10,6))corr=wines.corr()hm=sns.heatmap(round(corr,2),annot=True,ax=ax,cmap="coolwarm",fmt='.2f',linewidths=.05)f.subplots_adjust(top=0.93)
t=f.suptitle('WineAttributesCorrelationHeatmap',fontsize=14)
根据上图,可以看到散点图也是观察数据属性的2维潜在关系或模式的有效方式。另一种将多元数据可视化为多个属性的方法是使用平行坐标图。
基本上,在如上所述的可视化中,点被表征为连接的线段。每条垂直线代表一个数据属性。所有属性中的一组完整的连接线段表征一个数据点。因此,趋于同一类的点将会更加接近。仅仅通过观察就可以清楚看到,与白葡萄酒相比,红葡萄酒的密度略高。与红葡萄酒相比,白葡萄酒的残糖和二氧化硫总量也较高,红葡萄酒的固定酸度高于白葡萄酒。查一下我们之前得到的统计表中的统计数据,看看能否验证这个假设!
因此,让我们看看可视化两个连续型数值属性的方法。散点图和联合分布图(jointplot)是检查模式、关系以及属性分布的特别好的方法。
#ScatterPlotplt.scatter(wines['sulphates'],wines['alcohol'],alpha=0.4,edgecolors='w')
plt.xlabel('Sulphates')plt.ylabel('Alcohol')plt.title('WineSulphates-AlcoholContent',y=1.05)
#JointPlotjp=sns.jointplot(x='sulphates',y='alcohol',data=wines,
kind='reg',space=0,size=5,ratio=4)
如何可视化两个连续型数值属性?一种方法是为分类维度画单独的图(子图)或分面(facet)。
#UsingsubplotsorfacetsalongwithBarPlotsfig=plt.figure(figsize=(10,4))title=fig.suptitle("WineType-Quality",fontsize=14)fig.subplots_adjust(top=0.85,wspace=0.3)#redwine-winequalityax1=fig.add_subplot(1,2,1)ax1.set_title("RedWine")ax1.set_xlabel("Quality")ax1.set_ylabel("Frequency")rw_q=red_wine['quality'].value_counts()rw_q=(list(rw_q.index),list(rw_q.values))ax1.set_ylim([0,2500])ax1.tick_params(axis='both',which='major',labelsize=8.5)bar1=ax1.bar(rw_q[0],rw_q[1],color='red',edgecolor='black',linewidth=1)
#whitewine-winequalityax2=fig.add_subplot(1,2,2)ax2.set_title("WhiteWine")ax2.set_xlabel("Quality")ax2.set_ylabel("Frequency")ww_q=white_wine['quality'].value_counts()ww_q=(list(ww_q.index),list(ww_q.values))ax2.set_ylim([0,2500])ax2.tick_params(axis='both',which='major',labelsize=8.5)bar2=ax2.bar(ww_q[0],ww_q[1],color='white',
edgecolor='black',linewidth=1)
虽然这是一种可视化分类数据的好方法,但正如所见,利用matplotlib需要编写大量的代码。另一个好方法是在单个图中为不同的属性画堆积条形图或多个条形图。可以很容易地利用seaborn做到。
#Multi-barPlotcp=sns.countplot(x="quality",hue="wine_type",data=wines,
palette={"red":"#FF9999","white":"#FFE888"})
这看起来更清晰,你也可以有效地从单个图中比较不同的类别。
让我们看看可视化2维混合属性(大多数兼有数值和分类)。一种方法是使用分图\子图与直方图或核密度图。
#facetswithhistogramsfig=plt.figure(figsize=(10,4))title=fig.suptitle("SulphatesContentinWine",fontsize=14)fig.subplots_adjust(top=0.85,wspace=0.3)
ax1=fig.add_subplot(1,2,1)ax1.set_title("RedWine")ax1.set_xlabel("Sulphates")ax1.set_ylabel("Frequency")ax1.set_ylim([0,1200])ax1.text(1.2,800,r'$\mu$='+str(round(red_wine['sulphates'].mean(),2)),fontsize=12)r_freq,r_bins,r_patches=ax1.hist(red_wine['sulphates'],color='red',bins=15,edgecolor='black',linewidth=1)
ax2=fig.add_subplot(1,2,2)ax2.set_title("WhiteWine")ax2.set_xlabel("Sulphates")ax2.set_ylabel("Frequency")ax2.set_ylim([0,1200])ax2.text(0.8,800,r'$\mu$='+str(round(white_wine['sulphates'].mean(),2)),fontsize=12)w_freq,w_bins,w_patches=ax2.hist(white_wine['sulphates'],color='white',bins=15,edgecolor='black',linewidth=1)
#facetswithdensityplotsfig=plt.figure(figsize=(10,4))title=fig.suptitle("SulphatesContentinWine",fontsize=14)fig.subplots_adjust(top=0.85,wspace=0.3)
ax1=fig.add_subplot(1,2,1)ax1.set_title("RedWine")ax1.set_xlabel("Sulphates")ax1.set_ylabel("Density")sns.kdeplot(red_wine['sulphates'],ax=ax1,shade=True,color='r')
ax2=fig.add_subplot(1,2,2)ax2.set_title("WhiteWine")ax2.set_xlabel("Sulphates")ax2.set_ylabel("Density")
sns.kdeplot(white_wine['sulphates'],ax=ax2,shade=True,color='y')
虽然这很好,但是我们再一次编写了大量代码,我们可以通过利用seaborn避免这些,在单个图表中画出这些图。
#UsingmultipleHistogramsfig=plt.figure(figsize=(6,4))title=fig.suptitle("SulphatesContentinWine",fontsize=14)fig.subplots_adjust(top=0.85,wspace=0.3)ax=fig.add_subplot(1,1,1)ax.set_xlabel("Sulphates")ax.set_ylabel("Frequency")
g=sns.FacetGrid(wines,hue='wine_type',palette={"red":"r","white":"y"})g.map(sns.distplot,'sulphates',kde=False,bins=15,ax=ax)ax.legend(title='WineType')
plt.close(2)
可以看到上面生成的图形清晰简洁,我们可以轻松地比较各种分布。除此之外,箱线图(boxplot)是根据分类属性中的不同数值有效描述数值数据组的另一种方法。箱线图是了解数据中四分位数值以及潜在异常值的好方法。
#BoxPlotsf,(ax)=plt.subplots(1,1,figsize=(12,4))f.suptitle('WineQuality-AlcoholContent',fontsize=14)
sns.boxplot(x="quality",y="alcohol",data=wines,ax=ax)ax.set_xlabel("WineQuality",size=12,alpha=0.8)
ax.set_ylabel("WineAlcohol%",size=12,alpha=0.8)
另一个类似的可视化是小提琴图,这是使用核密度图显示分组数值数据的另一种有效方法(描绘了数据在不同值下的概率密度)。
#ViolinPlotsf,(ax)=plt.subplots(1,1,figsize=(12,4))f.suptitle('WineQuality-SulphatesContent',fontsize=14)
sns.violinplot(x="quality",y="sulphates",data=wines,ax=ax)ax.set_xlabel("WineQuality",size=12,alpha=0.8)
ax.set_ylabel("WineSulphates",size=12,alpha=0.8)
你可以清楚看到上面的不同酒品质类别的葡萄酒硫酸盐的密度图。
将2维数据可视化非常简单直接,但是随着维数(属性)数量的增加,数据开始变得复杂。原因是因为我们受到显示媒介和环境的双重约束。
对于3维数据,可以通过在图表中采用z轴或利用子图和分面来引入深度的虚拟坐标。
可视化3维数据(3-D)
这里研究有3个属性或维度的数据,我们可以通过考虑配对散点图并引入颜色或色调将分类维度中的值分离出来。
#ScatterPlotwithHueforvisualizingdatain3-Dcols=['density','residualsugar','totalsulfurdioxide','fixedacidity','wine_type']pp=sns.pairplot(wines[cols],hue='wine_type',size=1.8,aspect=1.8,palette={"red":"#FF9999","white":"#FFE888"},plot_kws=dict(edgecolor="black",linewidth=0.5))fig=pp.figfig.subplots_adjust(top=0.93,wspace=0.3)
t=fig.suptitle('WineAttributesPairwisePlots',fontsize=14)
让我们来看看可视化3个连续型数值属性的策略。一种方法是将2个维度表征为常规长度(x轴)和宽度(y轴)并且将第3维表征为深度(z轴)的概念。
#Visualizing3-DnumericdatawithScatterPlots#length,breadthanddepthfig=plt.figure(figsize=(8,6))ax=fig.add_subplot(111,projection='3d')
xs=wines['residualsugar']ys=wines['fixedacidity']zs=wines['alcohol']ax.scatter(xs,ys,zs,s=50,alpha=0.6,edgecolors='w')
ax.set_xlabel('ResidualSugar')ax.set_ylabel('FixedAcidity')
ax.set_zlabel('Alcohol')
我们还可以利用常规的2维坐标轴,并将尺寸大小的概念作为第3维(本质上是气泡图),其中点的尺寸大小表征第3维的数量。
#Visualizing3-Dnumericdatawithabubblechart#length,breadthandsizeplt.scatter(wines['fixedacidity'],wines['alcohol'],s=wines['residualsugar']*25,alpha=0.4,edgecolors='w')
plt.xlabel('FixedAcidity')plt.ylabel('Alcohol')
plt.title('WineAlcoholContent-FixedAcidity-ResidualSugar',y=1.05)
因此,你可以看到上面的图表不是一个传统的散点图,而是点(气泡)大小基于不同残糖量的的气泡图。当然,并不总像这种情况可以发现数据明确的模式,我们看到其它两个维度的大小也不同。
为了可视化3个离散型分类属性,我们可以使用常规的条形图,可以利用色调的概念以及分面或子图表征额外的第3个维度。seaborn框架帮助我们最大程度地减少代码,并高效地绘图。
#Visualizing3-Dcategoricaldatausingbarplots#leveragingtheconceptsofhueandfacetsfc=sns.factorplot(x="quality",hue="wine_type",col="quality_label",data=wines,kind="count",
考虑到可视化3维混合属性,我们可以使用色调的概念来将其中一个分类属性可视化,同时使用传统的如散点图来可视化数值属性的2个维度。
#Visualizing3-Dmixdatausingscatterplots#leveragingtheconceptsofhueforcategoricaldimensionjp=sns.pairplot(wines,x_vars=["sulphates"],y_vars=["alcohol"],size=4.5,hue="wine_type",palette={"red":"#FF9999","white":"#FFE888"},plot_kws=dict(edgecolor="k",linewidth=0.5))
#wecanalsoviewrelationships\correlationsasneededlp=sns.lmplot(x='sulphates',y='alcohol',hue='wine_type',palette={"red":"#FF9999","white":"#FFE888"},data=wines,fit_reg=True,legend=True,scatter_kws=dict(edgecolor="k",linewidth=0.5))
#Visualizing3-Dmixdatausingkerneldensityplots#leveragingtheconceptsofhueforcategoricaldimensionax=sns.kdeplot(white_wine['sulphates'],white_wine['alcohol'],cmap="YlOrBr",shade=True,shade_lowest=False)ax=sns.kdeplot(red_wine['sulphates'],red_wine['alcohol'],cmap="Reds",shade=True,shade_lowest=False)
与预期一致且相当明显,红葡萄酒样品比白葡萄酒具有更高的硫酸盐含量。你还可以根据色调强度查看密度浓度。
如果我们正在处理有多个分类属性的3维数据,我们可以利用色调和其中一个常规轴进行可视化,并使用如箱线图或小提琴图来可视化不同的数据组。
#Visualizing3-Dmixdatausingviolinplots#leveragingtheconceptsofhueandaxesfor>1categoricaldimensionsf,(ax1,ax2)=plt.subplots(1,2,figsize=(14,4))f.suptitle('WineType-Quality-Acidity',fontsize=14)
sns.violinplot(x="quality",y="volatileacidity",data=wines,inner="quart",linewidth=1.3,ax=ax1)ax1.set_xlabel("WineQuality",size=12,alpha=0.8)ax1.set_ylabel("WineVolatileAcidity",size=12,alpha=0.8)
sns.violinplot(x="quality",y="volatileacidity",hue="wine_type",data=wines,split=True,inner="quart",linewidth=1.3,palette={"red":"#FF9999","white":"white"},ax=ax2)ax2.set_xlabel("WineQuality",size=12,alpha=0.8)ax2.set_ylabel("WineVolatileAcidity",size=12,alpha=0.8)
l=plt.legend(loc='upperright',title='WineType')
在上图中,我们可以看到,在右边的3维可视化图中,我们用x轴表示葡萄酒质量,wine_type用色调表征。我们可以清楚地看到一些有趣的见解,例如与白葡萄酒相比红葡萄酒的挥发性酸度更高。
你也可以考虑使用箱线图来代表具有多个分类变量的混合属性。
#Visualizing3-Dmixdatausingboxplots#leveragingtheconceptsofhueandaxesfor>1categoricaldimensionsf,(ax1,ax2)=plt.subplots(1,2,figsize=(14,4))f.suptitle('WineType-Quality-AlcoholContent',fontsize=14)
sns.boxplot(x="quality",y="alcohol",hue="wine_type",data=wines,palette={"red":"#FF9999","white":"white"},ax=ax1)ax1.set_xlabel("WineQuality",size=12,alpha=0.8)ax1.set_ylabel("WineAlcohol%",size=12,alpha=0.8)
sns.boxplot(x="quality_label",y="alcohol",hue="wine_type",data=wines,palette={"red":"#FF9999","white":"white"},ax=ax2)ax2.set_xlabel("WineQualityClass",size=12,alpha=0.8)ax2.set_ylabel("WineAlcohol%",size=12,alpha=0.8)
l=plt.legend(loc='best',title='WineType')
我们可以看到,对于质量和quality_label属性,葡萄酒酒精含量都会随着质量的提高而增加。另外红葡萄酒与相同品质类别的白葡萄酒相比具有更高的酒精含量(中位数)。然而,如果检查质量等级,我们可以看到,对于较低等级的葡萄酒(3和4),白葡萄酒酒精含量(中位数)大于红葡萄酒样品。否则,红葡萄酒与白葡萄酒相比似乎酒精含量(中位数)略高。
可视化4维数据(4-D)
基于上述讨论,我们利用图表的各个组件可视化多个维度。一种可视化4维数据的方法是在传统图如散点图中利用深度和色调表征特定的数据维度。
#Visualizing4-Dmixdatausingscatterplots#leveragingtheconceptsofhueanddepthfig=plt.figure(figsize=(8,6))t=fig.suptitle('WineResidualSugar-AlcoholContent-Acidity-Type',fontsize=14)ax=fig.add_subplot(111,projection='3d')
xs=list(wines['residualsugar'])ys=list(wines['alcohol'])zs=list(wines['fixedacidity'])data_points=[(x,y,z)forx,y,zinzip(xs,ys,zs)]colors=['red'ifwt=='red'else'yellow'forwtinlist(wines['wine_type'])]
fordata,colorinzip(data_points,colors):x,y,z=dataax.scatter(x,y,z,alpha=0.4,c=color,edgecolors='none',s=30)
ax.set_xlabel('ResidualSugar')ax.set_ylabel('Alcohol')ax.set_zlabel('FixedAcidity')
通过利用散点图以及色调和深度的概念可视化4维数据
wine_type属性由上图中的色调表征得相当明显。此外,由于图的复杂性,解释这些可视化开始变得困难,但我们仍然可以看出,例如红葡萄酒的固定酸度更高,白葡萄酒的残糖更高。当然,如果酒精和固定酸度之间有某种联系,我们可能会看到一个逐渐增加或减少的数据点趋势。
另一个策略是使用二维图,但利用色调和数据点大小作为数据维度。通常情况下,这将类似于气泡图等我们先前可视化的图表。
#Visualizing4-Dmixdatausingbubbleplots#leveragingtheconceptsofhueandsizesize=wines['residualsugar']*25fill_colors=['#FF9999'ifwt=='red'else'#FFE888'forwtinlist(wines['wine_type'])]edge_colors=['red'ifwt=='red'else'orange'forwtinlist(wines['wine_type'])]
plt.scatter(wines['fixedacidity'],wines['alcohol'],s=size,alpha=0.4,color=fill_colors,edgecolors=edge_colors)
plt.title('WineAlcoholContent-FixedAcidity-ResidualSugar-Type',y=1.05)
我们用色调代表wine_type和数据点大小代表残糖。我们确实看到了与前面图表中观察到的相似模式,白葡萄酒气泡尺寸更大表征了白葡萄酒的残糖值更高。
如果我们有多于两个分类属性表征,可在常规的散点图描述数值数据的基础上利用色调和分面来描述这些属性。我们来看几个实例。
#Visualizing4-Dmixdatausingscatterplots#leveragingtheconceptsofhueandfacetsfor>1categoricalattributesg=sns.FacetGrid(wines,col="wine_type",hue='quality_label',col_order=['red','white'],hue_order=['low','medium','high'],aspect=1.2,size=3.5,palette=sns.light_palette('navy',4)[1:])g.map(plt.scatter,"volatileacidity","alcohol",alpha=0.9,edgecolor='white',linewidth=0.5,s=100)fig=g.figfig.subplots_adjust(top=0.8,wspace=0.3)fig.suptitle('WineType-Alcohol-Quality-Acidity',fontsize=14)
l=g.add_legend(title='WineQualityClass')
这种可视化的有效性使得我们可以轻松识别多种模式。白葡萄酒的挥发酸度较低,同时高品质葡萄酒具有较低的酸度。也基于白葡萄酒样本,高品质的葡萄酒有更高的酒精含量和低品质的葡萄酒有最低的酒精含量!
让我们借助一个类似实例,并建立一个4维数据的可视化。
可视化5维数据(5-D)
我们照旧遵从上文提出的策略,要想可视化5维数据,我们要利用各种绘图组件。我们使用深度、色调、大小来表征其中的三个维度。其它两维仍为常规轴。因为我们还会用到大小这个概念,并借此画出一个三维气泡图。
#Visualizing5-Dmixdatausingbubblecharts#leveragingtheconceptsofhue,sizeanddepthfig=plt.figure(figsize=(8,6))ax=fig.add_subplot(111,projection='3d')t=fig.suptitle('WineResidualSugar-AlcoholContent-Acidity-TotalSulfurDioxide-Type',fontsize=14)
xs=list(wines['residualsugar'])ys=list(wines['alcohol'])zs=list(wines['fixedacidity'])data_points=[(x,y,z)forx,y,zinzip(xs,ys,zs)]
ss=list(wines['totalsulfurdioxide'])colors=['red'ifwt=='red'else'yellow'forwtinlist(wines['wine_type'])]
fordata,color,sizeinzip(data_points,colors,ss):x,y,z=dataax.scatter(x,y,z,alpha=0.4,c=color,edgecolors='none',s=size)
ax.set_xlabel('ResidualSugar')ax.set_ylabel('Alcohol')
ax.set_zlabel('FixedAcidity')
利用气泡图和色调、深度、大小的概念来可视化5维数据
除了深度之外,我们还可以使用分面和色调来表征这五个数据维度中的多个分类属性。其中表征大小的属性可以是数值表征甚至是类别(但是我们可能要用它的数值表征来表征数据点大小)。由于缺乏类别属性,此处我们不作展示,但是你可以在自己的数据集上试试。
通常还有一个前文介绍的5维数据可视化的备选方法。当看到我们先前绘制的图时,很多人可能会对多出来的维度深度困惑。该图重复利用了分面的特性,所以仍可以在2维面板上绘制出来且易于说明和绘制。
我们已经领略到多位数据可视化的复杂性!如果还有人想问,为何不增加维度?让我们继续简单探索下!
可视化6维数据(6-D)
目前我们画得很开心(我希望是如此!)我们继续在可视化中添加一个数据维度。我们将利用深度、色调、大小和形状及两个常规轴来描述所有6个数据维度。
我们将利用散点图和色调、深度、形状、大小的概念来可视化6维数据。
#Visualizing6-Dmixdatausingscattercharts#leveragingtheconceptsofhue,size,depthandshapefig=plt.figure(figsize=(8,6))t=fig.suptitle('WineResidualSugar-AlcoholContent-Acidity-TotalSulfurDioxide-Type-Quality',fontsize=14)ax=fig.add_subplot(111,projection='3d')
ss=list(wines['totalsulfurdioxide'])colors=['red'ifwt=='red'else'yellow'forwtinlist(wines['wine_type'])]markers=[','ifq=='high'else'x'ifq=='medium'else'o'forqinlist(wines['quality_label'])]
fordata,color,size,markinzip(data_points,colors,ss,markers):x,y,z=dataax.scatter(x,y,z,alpha=0.4,c=color,edgecolors='none',s=size,marker=mark)
这可是在一张图上画出6维数据!我们用形状表征葡萄酒的质量标注,优质(用方块标记),一般(用x标记),差(用圆标记):用色调表示红酒的类型,由深度和数据点大小确定的酸度表征总二氧化硫含量。
这个解释起来可能有点费劲,但是在试图理解多维数据的隐藏信息时,最好结合一些绘图组件将其可视化。
我们也可以用分面属性来代替深度构建6维数据可视化效果。
#Visualizing6-Dmixdatausingscattercharts#leveragingtheconceptsofhue,facetsandsizeg=sns.FacetGrid(wines,row='wine_type',col="quality",hue='quality_label',size=4)g.map(plt.scatter,"residualsugar","alcohol",alpha=0.5,edgecolor='k',linewidth=0.5,s=wines['totalsulfurdioxide']*2)fig=g.figfig.set_size_inches(18,8)fig.subplots_adjust(top=0.85,wspace=0.3)fig.suptitle('WineType-SulfurDioxide-ResidualSugar-Alcohol-QualityClass-QualityRating',fontsize=14)
因此,在这种情况下,我们利用分面和色调来表征三个分类属性,并使用两个常规轴和大小来表征6维数据可视化的三个数值属性。
四、结论
数据可视化与科学一样重要。如果你看到这,我很欣慰你能坚持看完这篇长文。我们的目的不是为了记住所有数据,也不是给出一套固定的数据可视化规则。本文的主要目的是理解并学习高效的数据可视化策略,尤其是当数据维度增大时。希望你以后可以用本文知识可视化你自己的数据集。
同时,推荐同学们参加
2024全国大学生高新技术竞赛—数学竞赛
这是一次全新的挑战机会!
竞赛介绍
为贯彻关于国家高新技术产业发展的重要指示精神,进一步明确“十四五”国家高新区的发展思路和重点任务,国家一级协会下属分会中国国际科技促进会物联网工作委员会,面向全国大学生举办“2024全国大学生高新技术竞赛—数学竞赛”。
报名方式
-扫描下方二维码进行报名-
或点击下方链接进行报名:
竞赛亮点
01-具有挑战性的赛题
大学的学习不应该仅仅停留在课堂学习与课后作业当中,一些优质的学科竞赛是各位同学见识更多可能性的机会。更具有挑战性的赛题,有助各位同学在准备竞赛的过程中提升自己,竞赛交流也可以帮助同学们拓宽学习视野。
02-备战数据国赛
本次数学竞赛的竞赛形式、考试难度与全国大学生数学竞赛相似。对于有意参加下半年全国大学生数学竞赛的同学而言,可以在本次竞赛中早做准备,见识赛题难度、赛题题量。
03-检验考研数学复习情况
对于有意考研升学的学生而言,本次竞赛赛题是由名校教师参考教学大纲出题,在保证数学竞赛赛题少而精的特点同时,还可以充当考研学生在考研数学科目的模拟考试。
04-共享学习资料
竞赛奖励
本次竞赛分组别、分考场进行评奖,设立一、二、三等奖及优秀奖,获奖比例(根据实际参赛人数计算):
一等奖:5%;
二等奖:15%;
三等奖:30%;
优秀奖:若干(成功参赛即可获得优秀奖)
-证书样图-
优秀指导教师:
根据指导报名竞赛的学生人数和学生获奖人数进行综合评定,评定合格的高校老师,颁发优秀指导教师荣誉证书。
优秀组织单位:
根据单位报名竞赛的学生人数和学生获奖人数进行综合评定,评定合格的单位,颁发优秀组织单位荣誉证书。
各院校(系)、学校社团均可申请优秀组织单位。
竞赛规则
(1)竞赛为个人赛,分为研究生组、本科生组、专科生组,报名时请根据个人实际情况选择组别参赛。(竞赛考题分为数学类和非数学类,报名时无须选择类别,考试时可直接选择想要参加类别的考场)
(2)竞赛题目来自竞赛资深专家、企事业单位实际应用场景应用题目。
(3)竞赛全程线上进行,需要提交电子版作品(手写图片拍照上传即可)。
(4)赛题将于竞赛开始时在竞赛官方主页以及竞赛报名网站上同时公布,分为数学类和非数学类两个组别,不邮寄书面题目。
竞赛须知
01参赛对象
普通高等院校、高职院校、二级学院、独立学院、本、专科在校大学生及研究生均可报名参加,专业不限;其他社会人员也可以报名参赛。