数据集
我们将使用temporal数据集来适应本文中显示的可视化效果,数据集可通过下方链接进行下载。
数据集:https://github.com/albertsl/datasets/tree/master/popularidad
Pandas
在介绍更复杂的方法之前,让我们从可视化数据的最基本方法开始。我们将只使用熊猫来查看数据并了解其分布方式。
我们要做的第一件事是可视化一些示例,查看这些示例包含了哪些列、哪些信息以及如何对值进行编码等等。
import pandas as pd
df = pd.read_csv('temporal.csv')
df.head(10)
Mes | data science | machine learning | deep learning | |
---|---|---|---|---|
0 | 2004-01-01 | 12 | 18 | 4 |
1 | 2004-02-01 | 12 | 21 | 2 |
2 | 2004-03-01 | 9 | 21 | 2 |
3 | 2004-04-01 | 10 | 16 | 4 |
4 | 2004-05-01 | 7 | 14 | 3 |
5 | 2004-06-01 | 9 | 17 | 3 |
6 | 2004-07-01 | 9 | 16 | 3 |
7 | 2004-08-01 | 7 | 14 | 3 |
8 | 2004-09-01 | 10 | 17 | 4 |
9 | 2004-10-01 | 8 | 17 | 4 |
使用命令描述,我们将看到数据如何分布,最大值,最小值,均值……
df.describe()
data science | machine learning | deep learning | |
---|---|---|---|
count | 194.000000 | 194.000000 | 194.000000 |
mean | 20.953608 | 27.396907 | 24.231959 |
std | 23.951006 | 28.091490 | 34.476887 |
min | 4.000000 | 7.000000 | 1.000000 |
25% | 6.000000 | 9.000000 | 2.000000 |
50% | 8.000000 | 13.000000 | 3.000000 |
75% | 26.750000 | 31.500000 | 34.000000 |
max | 100.000000 | 100.000000 | 100.000000 |
使用info命令,我们将看到每列包含的数据类型。我们可以发现一列的情况,当使用head命令查看时,该列似乎是数字的,但是如果我们查看后续数据,则字符串格式的值将被编码为字符串。
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 194 entries, 0 to 193
Data columns (total 4 columns):
Mes 194 non-null object
data science 194 non-null int64
machine learning 194 non-null int64
deep learning 194 non-null int64
dtypes: int64(3), object(1)
memory usage: 6.2+ KB
通常情况下,pandas都会限制其显示的行数和列数。这可能让很多程序员感到困扰,因为大家都希望能够可视化所有数据。
使用这些命令,我们可以增加限制,并且可以可视化整个数据。对于大型数据集,请谨慎使用此选项,否则可能无法显示它们。
pd.set_option('display.max_rows',500)
pd.set_option('display.max_columns',500)
pd.set_option('display.width',1000)
使用Pandas样式,我们可以在查看表格时获得更多信息。首先,我们定义一个格式字典,以便以清晰的方式显示数字(以一定格式显示一定数量的小数、日期和小时,并使用百分比、货币等)。不要惊慌,这是仅显示而不会更改数据,以后再处理也不会有任何问题。
为了给出每种类型的示例,我添加了货币和百分比符号,即使它们对于此数据没有任何意义。
format_dict = {'data science':'${0:,.2f}', 'Mes':'{:%m-%Y}', 'machine learning':'{:.2%}'}
#We make sure that the Month column has datetime format
df['Mes'] = pd.to_datetime(df['Mes'])
#We apply the style to the visualization
df.head().style.format(format_dict)
Mes | data science | machine learning | deep learning | |
---|---|---|---|---|
0 | 01-2004 | $12.00 | 1800.00% | 4 |
1 | 02-2004 | $12.00 | 2100.00% | 2 |
2 | 03-2004 | $9.00 | 2100.00% | 2 |
3 | 04-2004 | $10.00 | 1600.00% | 4 |
4 | 05-2004 | $7.00 | 1400.00% | 3 |
我们可以用颜色突出显示最大值和最小值。
format_dict = {'Mes':'{:%m-%Y}'}
#Simplified format dictionary with values that do make sense for our data
df.head().style.format(format_dict).highlight_max(color='darkgreen').highlight_min(color='#ff0000')

我们使用颜色渐变来显示数据值。
df.head(10).style.format(format_dict).background_gradient(subset=['data science', 'machine learning'], cmap='BuGn')

我们也可以用条形显示数据值。
df.head().style.format(format_dict).bar(color='red', subset=['data science', 'deep learning'])

此外,我们还可以结合以上功能并生成更复杂的可视化效果。
df.head(10).style.format(format_dict).background_gradient(subset = ['data science','machine learning'],cmap ='BuGn').highlight_max(color ='yellow')

Pandas分析
Pandas分析是一个库,可使用我们的数据生成交互式报告,我们可以看到数据的分布,数据的类型以及可能出现的问题。它非常易于使用,只需三行,我们就可以生成一个报告,该报告可以发送给任何人,即使您不了解编程也可以使用。
Matplotlib
Matplotlib是用于以图形方式可视化数据的最基本的库。它包含许多我们可以想到的图形。仅仅因为它是基本的并不意味着它并不强大,我们将要讨论的许多其他数据可视化库都基于它。
Matplotlib的图表由两个主要部分组成,即轴(界定图表区域的线)和图形(我们在其中绘制轴,标题和来自轴区域的东西),现在让我们创建最简单的图:
import matplotlib.pyplot as plt
plt.plot(df['Mes'], df['data science'], label='data science')
#The parameter label is to indicate the legend. This doesn't mean that it will be shown, we'll have to use another command that I'll explain later.
[<matplotlib.lines.Line2D at 0x11e3002d0>]

我们可以在同一张图中制作多个变量的图,然后进行比较。
plt.plot(df ['Mes'],df ['data science'],label ='data science')
plt.plot(df ['Mes'],df ['machine learning'],label ='machine learning ')
plt.plot(df ['Mes'],df ['deep learning'],label ='deep learning')

每种颜色代表哪个变量还不是很清楚。我们将通过添加图例和标题来改进图表。
plt.plot(df['Mes'], df['data science'], label='data science')
plt.plot(df['Mes'], df['machine learning'], label='machine learning')
plt.plot(df['Mes'], df['deep learning'], label='deep learning')
plt.xlabel('Date')
plt.ylabel('Popularity')
plt.title('Popularity of AI terms by date')
plt.grid(True)
plt.legend()

如果您是从终端或脚本中使用Python,则在使用我们上面编写的函数定义图后,请使用plt.show()。如果您使用的是Jupyter Notebook,则在制作图表之前,将%matplotlib内联添加到文件的开头并运行它。
我们可以在一个图形中制作多个图形。这对于比较图表或通过单个图像轻松共享几种图表类型的数据非常有用。
fig, axes = plt.subplots(2,2)
axes[0, 0].hist(df['data science'])
axes[0, 1].scatter(df['Mes'], df['data science'])
axes[1, 0].plot(df['Mes'], df['machine learning'])
axes[1, 1].plot(df['Mes'], df['deep learning'])

我们可以为每个变量的点绘制具有不同样式的图形:
plt.plot(df ['Mes'],df ['data science'],'r-')
plt.plot(df ['Mes'],df ['data science'] * 2,'bs')
plt.plot(df ['Mes'],df ['data science'] * 3,'g ^')

现在让我们看一些使用Matplotlib可以做的不同图形的例子。我们从散点图开始:
plt.scatter(df['data science'], df['machine learning'])

条形图示例:
plt.bar(df ['Mes'],df ['machine learning'],width = 20)

直方图示例:
plt.hist(df ['deep learning'],bins = 15)

我们可以在图形中添加文本,并以与图形中看到的相同的单位指示文本的位置。在文本中,我们甚至可以按照TeX语言添加特殊字符
我们还可以添加指向图形上特定点的标记。
plt.plot(df['Mes'], df['data science'], label='data science')
plt.plot(df['Mes'], df['machine learning'], label='machine learning')
plt.plot(df['Mes'], df['deep learning'], label='deep learning')
plt.xlabel('Date')
plt.ylabel('Popularity')
plt.title('Popularity of AI terms by date')
plt.grid(True)
plt.text(x='2010-01-01', y=80, s=r'$lambda=1, r^2=0.8

Seaborn
Seaborn是基于Matplotlib的库。基本上,它提供给我们的是更好的图形和功能,只需一行代码即可制作复杂类型的图形。
我们导入库并使用sns.set()初始化图形样式,如果没有此命令,图形将仍然具有与Matplotlib相同的样式。我们显示了最简单的图形之一,散点图:
import seaborn as sns
sns.set()
sns.scatterplot(df['Mes'], df['data science'])

我们可以在同一张图中添加两个以上变量的信息。为此,我们使用颜色和大小。我们还根据类别列的值制作了一个不同的图:
sns.relplot(x='Mes', y='deep learning', hue='data science', size='machine learning', data=df)

Seaborn提供的最受欢迎的图形之一是热图。通常使用它来显示数据集中变量之间的所有相关性:
sns.heatmap(df.corr(), annot = True, fmt ='.2f')

另一个最受欢迎的是配对图,它向我们显示了所有变量之间的关系。如果您有一个大数据集,请谨慎使用此功能,因为它必须显示所有数据点的次数与有列的次数相同,这意味着通过增加数据的维数,处理时间将成倍增加。
sns.pairplot(df)

联合图是一个非常有用的图,它使我们可以查看散点图以及两个变量的直方图,并查看它们的分布方式:
sns.jointplot(x='data science', y='machine learning', data=df)

) #Coordinates use the same units as the graphplt.annotate('Notice something?', xy=('2014-01-01', 30), xytext=('2006-01-01', 50), arrowprops={'facecolor':'red', 'shrink':0.05})

Seaborn
Seaborn是基于Matplotlib的库。基本上,它提供给我们的是更好的图形和功能,只需一行代码即可制作复杂类型的图形。
我们导入库并使用sns.set()初始化图形样式,如果没有此命令,图形将仍然具有与Matplotlib相同的样式。我们显示了最简单的图形之一,散点图:

我们可以在同一张图中添加两个以上变量的信息。为此,我们使用颜色和大小。我们还根据类别列的值制作了一个不同的图:

Seaborn提供的最受欢迎的图形之一是热图。通常使用它来显示数据集中变量之间的所有相关性:

另一个最受欢迎的是配对图,它向我们显示了所有变量之间的关系。如果您有一个大数据集,请谨慎使用此功能,因为它必须显示所有数据点的次数与有列的次数相同,这意味着通过增加数据的维数,处理时间将成倍增加。

联合图是一个非常有用的图,它使我们可以查看散点图以及两个变量的直方图,并查看它们的分布方式:
