摘要: 本文讲述了热图、二维密度图、蜘蛛图、树形图这四种Python数据可视化方法。python
数据可视化是任何数据科学或机器学习项目的一个重要组成部分。人们经常会从探索数据分析(EDA)开始,来深刻了解数据,而且建立可视化确实有助于让问题更清晰和更容易理解,尤为是对于那些较大的高维度数据集。在项目结束的时候,可以以清晰的、简洁的和使人信服的方式呈现最终结果,这是很是重要的,让你的用户可以理解和明白。dom
你可能已经看过了我以前的文章《5种快速和简单的Python数据可视化方法(含代码)》(5 Quick and Easy Data Visualizations in Python with Code),其中介绍了5种基本可视化方法:散点图、线图、柱状图、条形图和箱形图。这五个是简单而强大的可视化方法,你绝对能够经过这些方法从数据集中获得巨大的收获。在本文中,将介绍另外4个数据可视化方法,但稍微复杂一些,你能够在看完上一篇文章介绍的基本方法以后再用。机器学习
热图是数据的矩阵表示方式,其中每一个矩阵的值用一种颜色来表示。不一样的颜色表明不一样的级别,矩阵指数将两个对比的列或特征链接在一块儿。热图能够很好地显示出多个特征变量之间的关系,由于能够直接把一个级别看做一种颜色。还能够经过观察热图中的一些点来查看每一个关系是如何与数据集中的其它关系进行比较的。这些颜色的确提供了简单的表示方式,由于这是很是直观的。ide
如今来看下代码:与matplotlib库相比,seaborn库可用于更高级的图表,一般也须要更多的组件,如更多的颜色、图形或者变量。Matplotlib库用于显示图表,numpy用于生成数据,而pandas用于控制。绘图只是调用一个简单的seaborn函数,若是你发现了一些在视觉上很特别的东西,经过这个函数,还能够设置颜色映射。函数
# Importing libs importseaborn as sns import pandas aspd importnumpyasnp importmatplotlib.pyplotasplt # Create a random dataset data=pd.DataFrame(np.random.random((10,6)), columns=["Iron Man","CaptainAmerica","BlackWidow","Thor","Hulk", "Hawkeye"]) print(data) # Plot the heatmap heatmap_plot=sns.heatmap(data, center=0, cmap='gist_ncar') plt.show()
二维密度图是一维版本的简单扩展,可以看到关于2个变量的几率分布。让咱们看看下面的二维密度图,右边的刻度用颜色表示每一点的几率。最高的几率,看下数据集,彷佛大约是0.5的大小和1.4-ish的速度。正如你所看到的,二维密度图对于快速肯定数据对于两个变量最集中的区域很是地显著,而不是像一维密度图那样只集中一个变量。当你有两个对输出结果很是重要的变量,而且但愿了解它们如何一块儿对输出结果分布起做用的时候,二维密度图尤为适合。学习
Seaborn的代码超级简单,咱们将经过建立一个偏态分布介绍它。若是你发现某些颜色和阴影在视觉上更特别,那么大多数的可选参数都是为了看起来更清晰。ui
蜘蛛图是显示一对多关系最好的方法之一。也就是说,你能够绘制并查看区别于单个变量或类别的多个变量的值。在蜘蛛图中,一个变量相对于另外一个变量的特性是显而易见的,由于面积和长度在一些方向上变化了。若是你但愿了解几个类别关于这些变量是如何叠加起来的,能够并排绘制一下。在下图中,很容易比较三个电影角色的不一样属性,并了解他们的优点所在! this
此次咱们将可以直接使用matplotlib来建立可视化,而不是用seaborn。须要计算每一个属性所在的角度,由于咱们但愿它们沿圆周被平均地分隔开。咱们将在每一个计算的角度放置标签,而后把值绘制成一个点,该点到中心的距离取决于它的值或是级别。最后,为了清晰起见,咱们将使用半透明的颜色填充由链接各属性点的线所包含的区域。spa
# Import libs import pandas aspd importseabornassns importnumpyasnp importmatplotlib.pyplotasplt # Get the data df=pd.read_csv("avengers_data.csv") print(df) """ # Name Attack Defense Speed Range Health 0 1 Iron Man 83 80 75 70 70 1 2 Captain America 60 62 63 80 80 2 3 Thor 80 82 83 100 100 3 3 Hulk 80 100 67 44 92 4 4 Black Widow 52 43 60 50 65 5 5 Hawkeye 58 64 58 80 65 """ # Get the data for Iron Man labels=np.array(["Attack","Defense","Speed","Range","Health"]) stats=df.loc[0,labels].values # Make some calculations for the plot angles=np.linspace(0, 2*np.pi, len(labels), endpoint=False) stats=np.concatenate((stats,[stats[0]])) angles=np.concatenate((angles,[angles[0]])) # Plot stuff fig=plt.figure() ax=fig.add_subplot(111, polar=True) ax.plot(angles, stats, 'o-', linewidth=2) ax.fill(angles, stats, alpha=0.25) ax.set_thetagrids(angles *180/np.pi, labels) ax.set_title([df.loc[0,"Name"]]) ax.grid(True) plt.show()
咱们从小学就开始使用树形图了,树形图既天然又直观,还易于解释。直接链接的节点关系密切,而与有多个链接的节点差异很大。在下图中,我已经根据统计绘制了一小部分来自Kaggle的Pokemon with stats数据集:code
HP、攻击、防护、特殊攻击、特殊防护、速度
所以,与stats wise最匹配的Pokemon将紧密链接在一块儿。例如,咱们看到,在顶部,Arbok和Fearow是直接链接的,并且,若是咱们查看数据,Arbok总共有438个,而Fearow有442个,很是接近。可是一旦咱们移动到Raticate,咱们获得的总数是413,这与Arbok和Fearow的差异很大,这就是它们被分开的缘由。当咱们移动树的时候,基于类似性,Pokemon被分的组愈来愈多。在绿色组中的Pokemon相互之间比红色组中的更类似,即便没有直接的绿色链接。
对于树形图,咱们实际上要使用Scipy的。在查看了数据集以后,咱们将去掉字符串类型的列。咱们这么作只是为了要获得正确的可视化结果,但在实践中,最好是把这些字符串转换成分类变量,为了获得更好的结果和进行比较,咱们还设置了数据帧索引,以便可以适当地用它做为引用每一个节点的列。最后,在Scipy中计算和绘制树形图是很是简单的事了。
# Import libs import pandas aspd frommatplotlibimportpyplotasplt fromscipy.clusterimport hierarchy importnumpyasnp # Read in the dataset # Drop any fields that are strings # Only get the first 40 because this dataset is big df=pd.read_csv('Pokemon.csv') df=df.set_index('Name') del df.index.name df=df.drop(["Type 1", "Type 2", "Legendary"], axis=1) df=df.head(n=40) # Calculate the distance between each sample Z =hierarchy.linkage(df, 'ward') # Orientation our tree hierarchy.dendrogram(Z, orientation="left", labels=df.index) plt.show()
为了了解更多的关于数据可视化方面的知识,我建议你们学习这本书 — Data Visualisation Book,它提供了关于什么时候、何地、以及为何使用各个类型的可视化方法的全面而直观的讲解。