几个实用数据可视化图表Python代码!
1、平行坐标图
Parallel Coordinate 我们最多可以可视化 3 维数据。但是我们有时需要可视化超过 3 维的数据才能获得更多的信息。我们经常使用 PCA 或 t-SNE 来降维并绘制它。在降维的情况下,可能会丢失大量信息。在某些情况下,我们需要考虑所有特征, 平行坐标图有助于做到这一点。
上面的图片。横线(平行轴)表示鸢尾花的特征(花瓣长、萼片长、萼片宽、花瓣宽)。分类是Setosa, Versicolor和Virginica。上图将该物种编码为Setosa→1,Versicolor→2,Virginica→3。每个平行轴包含最小值到最大值(例如,花瓣长度从1到6.9,萼片长度从4.3到7.9,等等)。例如,考虑花瓣长度轴。这表明与其他两种植物相比,濑蝶属植物的花瓣长度较小,其中维珍属植物的花瓣长度最高。
有了这个图,我们可以很容易地获得数据集的总体信息。数据集是什么样子的?让我们来看看。
让我们用Plotly Express库[1]可视化数据。Plotly库提供了一个交互式绘图工具。
import plotly.express as pxdf = px.data.iris()fig = px.parallel_coordinates(df, color="species_id", labels={"species_id": "Species","sepal_width": "Sepal Width", "sepal_length": "Sepal Length","petal_width": "Petal Width", "petal_length": "Petal Length", },color_continuous_scale=px.colors.diverging.Tealrose,color_continuous_midpoint=2)fig.show()
除了上图以外我们还可以使用其他库,如pandas、scikit-learn和matplotlib来绘制并行坐标。
六边形分箱图
Hexagonal Binning
六边形分箱图是一种用六边形直观表示二维数值数据点密度的方法。 ax = df.plot.hexbin(x='sepal_width', y='sepal_length', gridsize=20,color='#BDE320')
如果仔细观察图表,我们会发现总面积被分成了无数个六边形。每个六边形覆盖特定区域。我们注意到六边形有颜色变化。六边形有的没有颜色,有的是淡绿色,有的颜色很深。根据图右侧显示的色标,颜色密度随密度变化。比例表示具有颜色变化的数据点的数量。六边形没有填充颜色,这意味着该区域没有数据点。
其他库,如 matplotlib、seaborn、bokeh(交互式绘图)也可用于绘制它。
等高线密度图
Contour
二维等高线密度图是可视化特定区域内数据点密度的另一种方法。这是为了找到两个数值变量的密度。例如,下面的图显示了在每个阴影区域有多少数据点。
import plotly.express as pxfig = px.density_contour(df, x="sepal_width", y="sepal_length")fig.update_traces(contours_coloring="fill", contours_showlabels = True)fig.show()
为了生成上面的图表,我这里使用了plotly库,因为它可以方便地绘制交互式的图表。我们这里绘制了两个变量 sepal_width 和 sepal_length 的密度。
当然,也可以使用其他库,如seaborn、matplotlib等。
4、QQ-plot
QQ plot是另一个有趣的图。QQ是Quantile - Quantile plot的缩写(Quantile/percentile是一个范围,在这个范围内数据下降了指定百分比。例如,第10个quantile/percentile表示在该范围下,找到了10%的数据,90% 超出范围)。这是一种直观地检查数值变量是否服从正态分布的方法。让我解释一下它是如何工作的。
图(a)是样本分布;(b) 是标准正态分布。对于样本分布,数据范围从 10 到 100(100% 数据在 10 到 100 之间)。但对于标准正态分布,100% 的数据在 -3 到 3(z 分数)的范围内。在 QQ 图中,两个 x 轴值均分为 100 个相等的部分(称为分位数)。如果我们针对 x 和 y 轴绘制这两个值,我们将得到一个散点图。
散点图位于对角线上。这意味着样本分布是正态分布。如果散点图位于左边或右边而不是对角线,这意味着样本不是正态分布的。
导入必要的库
import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport seaborn as sns
生成正态分布数据。
np.random.seed(10)# Generate Univariate Observationsgauss_data = 5 * np.random.randn(100) + 50
绘制数据点的分布。
sns.histplot(data=gauss_data, kde=True)
import statsmodels.api as sm# q-q plotsm.qqplot(gauss_data, line='s')plt.show()
小提琴图
Violin Plot
小提琴图与箱线图相关。我们能从小提琴图中获得的另一个信息是密度分布。简单来说就是一个结合了密度分布的箱线图。我们将其与箱线图进行比较。
在小提琴图中,小提琴中间的白点表示中点。实心框表示四分位数间距 (IQR)。上下相邻值是异常值的围栏。超出范围,一切都是异常值。下图显示了比较。
让我们看看小提琴图的可视化。
import seaborn as snssns.violinplot(data=df, y="sepal_width")
我们还可以通过传递名称来绘制不同物种的小提琴图。
import seaborn as snssns.violinplot(data=df,x='species', y="sepal_width")
箱线图的改进版
Boxen plot
Boxenplot 是 seaborn 库引入的一种新型箱线图。对于箱线图,框是在四分位数上创建的。但在 Boxenplot 中,数据被分成更多的分位数。它提供了对数据的更多内存。
鸢尾花数据集的 Boxenplot 显示了 sepal_width 的数据分布。
sns.boxenplot(x=df["sepal_width"])
上图显示了比箱线图更多的盒。这是因为每个框代表一个特定的分位数。
sns.boxenplot(data=df, x="species",y='sepal_width')
点图
下 图中有一些名为误差线的垂直线和其他一些连接这些垂直线的线。 让我们看看它的确切含义。
让我们举一个实际的例子—-我们继续使用 seaborn 库和 iris 数据集(在平行坐标部分中提到)。
import seaborn as snssns.pointplot(data=df,x="species", y="sepal_width")
分簇散点图
Swarm plot
Swarm plot 是另一个受“beeswarm”启发的有趣图表。通过此图我们可以轻松了解不同的分类值如何沿数值轴分布 [5]。它在不重叠数据点的情况下绘制数据。但它不适用于大型数据集。
import seaborn as snssns.swarmplot(data=df,x="species", y="sepal_width")
旭日图
Sunburst Chart
它是圆环图或饼图的定制版本,将一些额外的层次信息集成到图中 [7]。
整个图表被分成几个环(从内到外)。它保存层次结构信息,其中内环位于层次结构的顶部,外环位于较低的[7]阶。
import plotly.express as pxdf = px.data.tips()
绘制旭日图
fig = px.sunburst(df, path=['sex', 'day', 'time'],values='total_bill', color='time')fig.show()
sunburst类的path属性提供了层次结构,其中性别位于层次结构的顶部,然后是日期和时间。
词云
Word Cloud
词云图的想法非常简单。假设我们有一组文本文档。单词有很多,有些是经常出现的,有些是很少出现的。在词云图中,所有单词都被绘制在特定的区域中,频繁出现的单词被高亮显示(用较大的字体显示)。有了这个词云,我们可以很容易地找到重要的客户反馈,热门的政治议程话题等。
数据集:https://opendatacommons.org/licenses/odbl/1-0/
import pandas as pddata=pd.read_csv('/work/android-games.csv')data.head()
我们统计每个类别的数据数量
data.category.value_counts()GAME CARD 126GAME WORD 104GAME ACTION 100GAME ADVENTURE 100GAME STRATEGY 100GAME PUZZLE 100GAME SIMULATION 100GAME CASUAL 100GAME ARCADE 100GAME ROLE PLAYING 100GAME TRIVIA 100GAME BOARD 100GAME CASINO 100GAME RACING 100GAME EDUCATIONAL 100GAME SPORTS 100GAME MUSIC 100Name: category, dtype: int64
我们进行可视化。
#importing the module from wordcloud library from wordcloud import WordCloud import matplotlib.pyplot as plt #creating a text from the category column by taking only the 2nd part of the category. text = " ".join(cat.split()[1] for cat in data.category) #generating the cloud word_cloud = WordCloud(collocations = False, background_color = 'black').generate(text) plt.imshow(word_cloud, interpolation='bilinear') plt.axis("off") plt.show()
结
以下是本文的引用:
https://plotly.com/python/parallel-coordinates-plot/- END-
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.plot.hexbin.html
Hintze, V. P. A Box Plot-Density Trace Synergism. Am. Sat, (52), 181 (Open Access Journal).
seaborn.pointplot — seaborn 0.12.1 documentation (pydata.org)
seaborn.swarmplot — seaborn 0.12.1 documentation (pydata.org)
Create a sunburst chart in Office — Microsoft Support
- python可视化52|最有价值50图表(python实现代码分享)
- 详解Python列表推导式|迭代器|生成器|匿名函数
- Jupyter Notebook的16个超棒插件!
- 详解Python Matplotlib (pyplot法)
- 一图胜千言,超形象图解NumPy教程!