https://mp.weixin.qq.com/s?__biz=MzUyMjg4NjU5OQ==&mid=2247486873&idx=1&sn=7ef23a69ec570f1eab7379c76c2aeb69&chksm=f9c44131ceb3c82703bc20443e463ee30de7cec44b53a63421c67277ba535b6b2f88ddd7c98a&mpshare=1&scene=1&srcid=&pass_ticket=qU5dSYUuA%2FIieNGbbjcECG9HG1kGw1TqO8ZipEjMuTAmRykoF8IAJW7tAsmfoFc9#rd
数据可视化是通过将数据放置在可视上下文中来尝试理解数据的原则,因此可以暴露可能无法检测到的模式,趋势和相关性。
Python提供了多个出色的图形库,这些库包含许多不同的功能。无论您是想创建交互式,实时或高度自定义的绘图,python都能为您提供出色的库。
要获得一些概述,这里有一些流行的绘图库:
Matplotlib: 低级别,提供很多自由
https://matplotlib.org/
Pandas Visualization: 易于使用的界面,基于Matplotlib构建
https://pandas.pydata.org/pandas-docs/stable/visualization.html
Seaborn: 高级界面,很棒的默认样式
https://seaborn.pydata.org/
ggplot: 基于R的ggplot2,使用 Grammar of Graphics
http://ggplot.yhathq.com/
https://www.amazon.com/Grammar-Graphics-Statistics-Computing/dp/0387245448
Plotly: 可以创建交互式图
https://plot.ly/python/
在本文中,将学习如何使用Matplotlib,Pandas可视化和Seaborn创建基本图,以及如何使用每个库的某些特定功能。本文将重点介绍语法,而不是解释图表。
在后面的文章中,将介绍像Plotly这样的交互式绘图工具,它基于D3构建,也可以与JavaScript一起使用。
导入数据集
在本文中,将使用两个免费提供的数据集。该虹膜和葡萄酒评论数据集,都可以加载在使用pandas read_csv方法。
https://archive.ics.uci.edu/ml/datasets/iris
https://www.kaggle.com/zynicide/wine-reviews
import pandas as pd
iris = pd.read_csv('iris.csv', names=['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'class'])
print(iris.head())
图2:Iris数据集头
wine_reviews = pd.read_csv('winemag-data-130k-v2.csv', index_col=0)
wine_reviews.head()
图3:Wine Review数据集头
Matplotlib
Matplotlib是最受欢迎的python绘图库。它是一个低级库,带有类似Matlab的接口,以不得不编写更多代码为代价提供了大量的自由。
要安装Matplotlib,可以使用pip和conda。
pip install matplotlib
or
conda install matplotlib
Matplotlib特别适用于创建基本图形,如折线图,条形图,直方图等等。可以通过输入以下内容导入:
import matplotlib.pyplot as plt
散点图
要在Matplotlib中创建散点图,可以使用该scatter方法。还将创建一个图形和一个轴使用,plt.subplots这样可以给图标题和标签。
# create a figure and axis
fig, ax = plt.subplots()
# scatter the sepal_length against the sepal_width
ax.scatter(iris['sepal_length'], iris['sepal_width'])
# set a title and labels
ax.set_title('Iris Dataset')
ax.set_xlabel('sepal_length')
ax.set_ylabel('sepal_width')
图4:Matplotlib散点图
可以通过在每个数据点中按类别着色来赋予图形更多意义。这可以通过创建一个字典来完成,该字典从一个类映射到另一个颜色,然后使用for循环散布每个点并传递相应的颜色。
# create color dictionary
colors = {'Iris-setosa':'r', 'Iris-versicolor':'g', 'Iris-virginica':'b'}
# create a figure and axis
fig, ax = plt.subplots()
# plot each data-point
for i in range(len(iris['sepal_length'])):
ax.scatter(iris['sepal_length'][i], iris['sepal_width'][i],color=colors[iris['class'][i]])
# set a title and labels
ax.set_title('Iris Dataset')
ax.set_xlabel('sepal_length')
ax.set_ylabel('sepal_width')
图5:按类着色的散点图
折线图
在Matplotlib中,可以通过调用plot方法创建折线图。还可以在一个图中绘制多个列,循环遍历想要的列,并在同一轴上绘制每个列。
# get columns to plot
columns = iris.columns.drop(['class'])
# create x data
x_data = range(0, iris.shape[0])
# create figure and axis
fig, ax = plt.subplots()
# plot each column
for column in columns:
ax.plot(x_data, iris[column])
# set title and legend
ax.set_title('Iris Dataset')
ax.legend()
图6:折线图
直方图
在Matplotlib中,可以使用该hist方法创建直方图。如果将葡萄酒评论数据集中的分类数据(如点列)传递给它,它将自动计算每个类的出现频率。
# create figure and axis
fig, ax = plt.subplots()
# plot histogram
ax.hist(wine_reviews['points'])
# set title and labels
ax.set_title('Wine Review Scores')
ax.set_xlabel('Points')
ax.set_ylabel('Frequency')
图7:直方图
条形图
可以使用该bar方法创建条形图。条形图不会自动计算类别的频率,因此将使用pandas value_counts函数来执行此操作。条形图对于没有很多不同类别(少于30个)的分类数据很有用,因为它可能会变得非常混乱。
# create a figure and axis
fig, ax = plt.subplots()
# count the occurrence of each class
data = wine_reviews['points'].value_counts()
# get x and y data
points = data.index
frequency = data.values
# create bar chart
ax.bar(points, frequency)
# set title and labels
ax.set_title('Wine Review Scores')
ax.set_xlabel('Points')
ax.set_ylabel('Frequency')
图8:条形图
Pandas可视化
Pandas是一个开源的高性能,易于使用的库,提供数据结构,如数据框架,以及数据分析工具,如将在本文中使用的可视化工具。
Pandas Visualization使得从熊猫数据框和系列中创建图表变得非常容易。它还具有比Matplotlib更高级别的API,因此需要更少的代码来获得相同的结果。
可以使用pip或conda安装Pandas。
pip install pandas
or
conda install pandas
散点图
要在Pandas中创建散点图,可以调用
iris.plot.scatter(x='sepal_length', y='sepal_width', title='Iris Dataset')
图9:散点图
正如您在图像中看到的那样,它会自动将x和y标签设置为列名称。
折线图
要在Pandas中创建折线图,可以
iris.drop(['class'], axis=1).plot.line(title='Iris Dataset')
图10:折线图
如果有多个功能,Pandas会自动为创建一个图例,如上图所示。
直方图
在Pandas中,可以使用该plot.hist方法创建直方图。没有任何必需的参数,但可以选择传递一些像bin大小。
wine_reviews['points'].plot.hist()
图11:直方图
创建多个直方图也很容易。
iris.plot.hist(subplots=True, layout=(2,2), figsize=(10, 10), bins=20)
图12:多个直方图
该subplots参数指定要对每个功能和独立的情节layout指定每行和列曲线的数量。
条形图
要绘制条形图,可以使用该plot.bar()方法,但在调用它之前,需要获取数据。为此将首先使用value_count()方法计算出现次数,然后使用该方法将出现次数从最小值排序为最大值sort_index()。
wine_reviews['points'].value_counts().sort_index().plot.bar()
图13:垂直条形图
它也很简单使用,使水平条形图plot.barh()方法。
wine_reviews['points'].value_counts().sort_index().plot.barh()
图14:水平条形图
还可以绘制其他数据,然后绘制出现次数。
wine_reviews.groupby("country").price.mean().sort_values(ascending=False)[:5].plot.bar()
图15:葡萄酒最贵的国家(平均)
在上面的例子中,按国家对数据进行分组,然后取出葡萄酒价格的平均值,对其进行排序,并绘制出平均葡萄酒价格最高的5个国家。
Seaborn
Seaborn是一个基于Matplotlib的Python数据可视化库。它提供了一个用于创建有吸引力的图形的高级界面。
Seaborn有很多东西可供选择。您可以在一行中创建图形,在Matplotlib中可以使用数十行。它的标准设计很棒,它还有一个很好的界面来处理pandas数据帧。
可以通过输入以下内容导入:
import seaborn as sns
散点图
可以使用该 .scatterplot方法创建散点图,就像在Pandas中需要传递x和y数据的列名一样,但是现在还需要将数据作为附加参数传递,因为没有调用像在Pandas中那样直接对数据起作用。
sns.scatterplot(x='sepal_length', y='sepal_width', data=iris)
图16:散点图
还可以使用hue参数逐个突出显示点,这比在Matplotlib中要容易得多。
sns.scatterplot(x='sepal_length', y='sepal_width', hue='class', data=iris)
图17:按类着色的散点图
折线图
要创建折线图,sns.lineplot可以使用该方法。唯一需要的参数是数据,在例子中是Iris数据集中的四个数字列。还可以使用sns.kdeplot舍入曲线边缘的方法,因此如果数据集中有很多异常值,则更清晰。
sns.lineplot(data=iris.drop(['class'], axis=1))
图18:折线图
直方图
要在Seaborn中创建直方图,使用该sns.distplot方法。需要将它传递给想要绘制的列,它将自己计算出现次数。如果想在图中绘制高斯核密度估计,也可以传递它的数量。
sns.distplot(wine_reviews['points'], bins=10, kde=False)
图19:直方图
sns.distplot(wine_reviews['points'], bins=10, kde=True)
图20:具有高斯核密度估计的直方图
条形图
在Seaborn中,可以使用该sns.countplot方法创建条形图并将数据传递给它。
sns.countplot(wine_reviews['points'])
图21:条形图
其他图表
现在您已经对Matplotlib,Pandas Visualization和Seaborn语法有了基本的了解,我想向您展示一些对提取内部很有用的其他图形类型。
对于他们中的大多数人来说,Seaborn是去图书馆的,因为它的高级界面允许在几行代码中创建漂亮的图形。
方块图
Box Plot是显示五位数摘要的图形方法。我们可以使用seaborns sns.boxplot方法创建箱形图并将数据以及x和y列名称传递给它。
https://en.wikipedia.org/wiki/Five-number_summary
df = wine_reviews[(wine_reviews['points']>=95) & (wine_reviews['price']<1000)]
sns.boxplot('points', 'price', data=df)
图22:Boxplot
Box Plots就像条形图一样,对于只有少数类别的数据非常有用,但很快就会变得混乱。
热图
热图是数据的图形表示,其中矩阵中包含的各个值表示为颜色。热图非常适合探索数据集中要素的相关性。
为了获得可以调用的数据集内的特征的相关性
现在可以使用Matplotlib或Seaborn来创建热图。
Matplotlib:
# get correlation matrix
corr = iris.corr()
fig, ax = plt.subplots()
# create heatmap
im = ax.imshow(corr.values)
# set labels
ax.set_xticks(np.arange(len(corr.columns)))
ax.set_yticks(np.arange(len(corr.columns)))
ax.set_xticklabels(corr.columns)
ax.set_yticklabels(corr.columns)
# Rotate the tick labels and set their alignment.
plt.setp(ax.get_xticklabels(), rotation=45, ha="right",
rotation_mode="anchor")
图23:没有注释的热图
要向热图添加注释,需要添加两个for循环:
# get correlation matrix
corr = iris.corr()
fig, ax = plt.subplots()
# create heatmap
im = ax.imshow(corr.values)
# set labels
ax.set_xticks(np.arange(len(corr.columns)))
ax.set_yticks(np.arange(len(corr.columns)))
ax.set_xticklabels(corr.columns)
ax.set_yticklabels(corr.columns)
# Rotate the tick labels and set their alignment.
plt.setp(ax.get_xticklabels(), rotation=45, ha="right",
rotation_mode="anchor")
# Loop over data dimensions and create text annotations.
for i in range(len(corr.columns)):
for j in range(len(corr.columns)):
text = ax.text(j, i, np.around(corr.iloc[i, j], decimals=2),
ha="center", va="center", color="black")
图24:带注释的热图
Seaborn可以更轻松地创建热图并添加注释:
sns.heatmap(iris.corr(), annot=True)
图25:带注释的热图
Faceting
Faceting是跨多个子图破坏数据变量的行为,并将这些子图组合成一个图。
如果您想快速浏览数据集,Faceting非常有用。
要在Seaborn中使用一种Faceting,可以使用FacetGrid 。首先,需要定义FacetGrid并传递数据以及行或列,它们将用于分割数据。然后需要map 在FacetGrid对象上调用函数并定义想要使用的绘图类型,以及想要绘制的列。
g = sns.FacetGrid(iris, col='class')
g = g.map(sns.kdeplot, 'sepal_length')
图26:小平面图
你可以制作比上面的例子更大更复杂的情节。你可以在这里找到一些例子。
https://seaborn.pydata.org/generated/seaborn.FacetGrid.html
Pairplot
最后将向您展示Seaborns pairplot和Pandas scatter_matrix,它们使您能够在数据集中绘制成对关系的网格。
sns.pairplot(iris)
图27:配对图
from pandas.plotting import scatter_matrix
fig, ax = plt.subplots(figsize=(12,12))
scatter_matrix(iris, alpha=1, ax=ax)
图28:散点矩阵
正如您在上面的图像中看到的,这些技术总是相互绘制两个特征。图的对角线用直方图填充,其他图是散点图。
结论
数据可视化是通过将数据放置在可视上下文中来尝试理解数据的原则,因此可以暴露可能无法检测到的模式,趋势和相关性。
Python提供了多个出色的图形库,这些库包含许多不同的功能。在本文中,研究了Matplotlib,Pandas可视化和Seaborn。
本文中介绍的代码以Github存储库的形式提供。
https://github.com/TannerGilbert/Articles/tree/master/Introduction%20to%20Data%20Visualization%20in%C2%A0Python