用代码在Python中实现5个快速而简单的数据可视化
想得到启发吗?来加入我的超级引言通讯吧。😎
数据可视化是数据科学家工作的一个重要部分。在项目的早期阶段,你经常会做一个探索性数据分析(EDA),以获得对数据的一些见解。创建可视化真的有助于使事情变得更加清晰和容易理解,特别是对于较大的高维数据集。在项目接近尾声时,能够以清晰、简明、有说服力的方式展示你的最终结果是很重要的,而你的听众往往是非技术性的客户,他们能够理解。
Matplotlib是一个流行的Python库,可以很容易地用于创建你的数据可视化。然而,每次做一个新项目时,设置数据、参数、数字和绘图都会变得相当混乱和乏味。在这篇博文中,我们将看一下5个数据可视化,并用Python的Matplotlib
为它们写一些快速而简单的函数。
在我们开始之前,请查看AI智能通讯,以阅读关于AI、机器学习和数据科学的最新和最重要的信息。
散点图
散点图很适合显示两个变量之间的关系,因为你可以直接看到数据的原始分布。你还可以通过对不同的数据组进行颜色编码来简单地查看这种关系,如下图所示。想把三个变量之间的关系可视化?没问题! 只需使用另一个参数,如点的大小,来编码第三个变量,我们可以在下面的第二个图中看到。我们刚才讨论的这些点也都与第一张图的内容一致。
带颜色分组的散点图
用颜色分组的散点图和国家大小的第三个变量的大小编码
现在来看看代码。我们首先导入Matplotlib
的pyplot
,别名为 "plt"。为了创建一个新的图表,我们调用plt.subplots()
。我们把x轴和y轴的数据传给该函数,然后把这些数据传给ax.scatter()
来绘制散点图。我们还可以设置点的大小、点的颜色和alpha透明度。你甚至可以将y轴设置为对数刻度。然后为该图专门设置标题和轴标签。这是一个易于使用的函数,它可以从头到尾地创建一个散点图!
import matplotlib.pyplot as plt
import numpy as np
def scatterplot(x_data, y_data, x_label="", y_label="", title="", color = "r", yscale_log=False):
# Create the plot object
_, ax = plt.subplots()
# Plot the data, set the size (s), color and transparency (alpha)
# of the points
ax.scatter(x_data, y_data, s = 10, color = color, alpha = 0.75)
if yscale_log == True:
ax.set_yscale('log')
# Label the axes and provide a title
ax.set_title(title)
ax.set_xlabel(x_label)
ax.set_ylabel(y_label)
线状图
当你能清楚地看到一个变量与另一个变量有很大的变化时,即它们有很高的协方差时,最好使用线状图。让我们看一下下面的图来说明。我们可以清楚地看到,随着时间的推移,所有专业的百分比都有很大的变化。用散点图绘制这些数据会非常杂乱,而且相当混乱,很难真正理解和看到发生了什么。线状图非常适合这种情况,因为它们基本上给我们提供了两个变量(百分比和时间)的协方差的快速总结。同样,我们也可以用颜色编码的方式进行分组。线形图属于我们第一个图表中的 "超时 "类别。
线形图示例
这里是折线图的代码。它与上面的散点图很相似。只是在变量上有一些小的变化。
code
def lineplot(x_data, y_data, x_label="", y_label="", title=""):
# Create the plot object
_, ax = plt.subplots()
# Plot the best fit line, set the linewidth (lw), color and
# transparency (alpha) of the line
ax.plot(x_data, y_data, lw = 2, color = '#539caf', alpha = 1)
# Label the axes and provide a title
ax.set_title(title)
ax.set_xlabel(x_label)
ax.set_ylabel(y_label)
柱状图
直方图对于查看(或真正发现)数据点的分布非常有用。请看下面的直方图,我们绘制了频率与智商的直方图。我们可以清楚地看到向中心集中的情况以及中位数是什么。我们还可以看到,它遵循高斯分布。
使用条形图(而不是散点,例如)确实让我们清楚地看到了每个bin的频率之间的相对差异。使用bin(离散化)真的可以帮助我们看到 "大局",如果我们使用所有的数据点而不使用离散的bin,那么在可视化中可能会有很多噪音,使我们很难看到真正发生了什么。
def histogram(data, n_bins, cumulative=False, x_label = "", y_label = "", title = ""):
_, ax = plt.subplots()
ax.hist(data, n_bins = n_bins, cumulative = cumulative, color = '#539caf')
ax.set_ylabel(y_label)
ax.set_xlabel(x_label)
ax.set_title(title)
直方图的例子
Matplotlib中直方图的代码如下所示。有两个参数需要注意。首先,n_bins参数控制我们的直方图需要多少个离散的bin。更多的bin会给我们提供更精细的信息,但也可能引入噪音,使我们远离大局;另一方面,更少的bin会给我们提供更多的 "鸟瞰图 "和更大的画面,而没有更多的细节。第二,累积参数是一个布尔值,允许我们选择我们的直方图是否是累积的。这基本上就是选择概率密度函数(PDF)或累积密度函数(CDF)。
想象一下,我们想比较数据中两个变量的分布。人们可能会认为,你必须制作两个独立的直方图,并把它们并排放在一起进行比较。但是,实际上有一个更好的方法:我们可以用不同的透明度来叠加直方图。请看下面的图。均匀分布被设置为透明度为0.5,这样我们就可以看到它后面的内容。这使得我们可以在同一个图上直接查看这两个分布。
叠加直方图
对于叠加直方图,有几件事需要在代码中进行设置。首先,我们设置水平范围以适应两个变量的分布。根据这个范围和所需的bin数量,我们实际上可以用计算机计算每个bin的宽度。最后,我们将两张直方图绘制在同一张图上,其中一张稍稍透明一些。
# Overlay 2 histograms to compare them
def overlaid_histogram(data1, data2, n_bins = 0, data1_name="", data1_color="#539caf", data2_name="", data2_color="#7663b0", x_label="", y_label="", title=""):
# Set the bounds for the bins so that the two distributions are fairly compared
max_nbins = 10
data_range = [min(min(data1), min(data2)), max(max(data1), max(data2))]
binwidth = (data_range[1] - data_range[0]) / max_nbins
if n_bins == 0
bins = np.arange(data_range[0], data_range[1] + binwidth, binwidth)
else:
bins = n_bins
# Create the plot
_, ax = plt.subplots()
ax.hist(data1, bins = bins, color = data1_color, alpha = 1, label = data1_name)
ax.hist(data2, bins = bins, color = data2_color, alpha = 0.75, label = data2_name)
ax.set_ylabel(y_label)
ax.set_xlabel(x_label)
ax.set_title(title)
ax.legend(loc = 'best')
柱状图
当你试图将类别很少(可能<10个)的分类数据可视化时,条形图是最有效的。如果我们有太多的类别,那么条形图在图中就会非常凌乱,难以理解。条形图对于分类数据来说是很好的,因为你可以根据条形图的大小(即幅度)很容易地看到类别之间的差异;类别也很容易划分,也可以用颜色编码。我们要看的是3种不同类型的柱状图:普通的、分组的和堆积的。在我们进行的过程中,请看数字下面的代码。
常规条形图在下面的第一个图中。在barplot()函数中,x_data代表x轴上的tickers,y_data代表y轴上的bar高度。误差条是以每个条形图为中心的额外线条,可以用来显示标准差。
def barplot(x_data, y_data, error_data, x_label="", y_label="", title=""):
_, ax = plt.subplots()
# Draw bars, position them in the center of the tick mark on the x-axis
ax.bar(x_data, y_data, color = '#539caf', align = 'center')
# Draw error bars to show standard deviation, set ls to 'none'
# to remove line between points
ax.errorbar(x_data, y_data, yerr = error_data, color = '#297083', ls = 'none', lw = 2, capthick = 2)
ax.set_ylabel(y_label)
ax.set_xlabel(x_label)
ax.set_title(title)
def stackedbarplot(x_data, y_data_list, colors, y_data_names="", x_label="", y_label="", title=""):
_, ax = plt.subplots()
# Draw bars, one category at a time
for i in range(0, len(y_data_list)):
if i == 0:
ax.bar(x_data, y_data_list[i], color = colors[i], align = 'center', label = y_data_names[i])
else:
# For each category after the first, the bottom of the
# bar will be the top of the last category
ax.bar(x_data, y_data_list[i], color = colors[i], bottom = y_data_list[i - 1], align = 'center', label = y_data_names[i])
ax.set_ylabel(y_label)
ax.set_xlabel(x_label)
ax.set_title(title)
ax.legend(loc = 'upper right')
def groupedbarplot(x_data, y_data_list, colors, y_data_names="", x_label="", y_label="", title=""):
_, ax = plt.subplots()
# Total width for all bars at one x location
total_width = 0.8
# Width of each individual bar
ind_width = total_width / len(y_data_list)
# This centers each cluster of bars about the x tick mark
alteration = np.arange(-(total_width/2), total_width/2, ind_width)
# Draw bars, one category at a time
for i in range(0, len(y_data_list)):
# Move the bar to the right on the x-axis so it doesn't
# overlap with previously drawn ones
ax.bar(x_data + alteration[i], y_data_list[i], color = colors[i], label = y_data_names[i], width = ind_width)
ax.set_ylabel(y_label)
ax.set_xlabel(x_label)
ax.set_title(title)
ax.legend(loc = 'upper right')
分组条形图使我们能够比较多个分类变量。请看下面的第二个条形图。我们要比较的第一个变量是各组(G1、G2、......等组)的分数如何变化。我们也在用颜色代码来比较性别本身。看一下代码,y_data_list变量现在实际上是一个列表,其中每个子列表代表一个不同的组。然后我们循环浏览每一个组,对于每一个组,我们在X轴上的每一个刻度都画出条形图;每一个组也都用颜色编码。
我们之前看了直方图,它对于可视化变量的分布非常有用。但如果我们需要更多的信息呢?也许我们想更清楚地了解标准差?也许中位数与平均值相差很大,因此我们有很多离群值?如果出现了倾斜,许多数值都集中在一边怎么办?
这就是箱形图的作用。箱形图给了我们上述所有的信息。实线框的底部和顶部总是第一和第三四分位数(即数据的25%和75%),框内的带子总是第二四分位数(中位数)。胡须(即末端有条形的虚线)从盒子里延伸出来,显示数据的范围。
由于箱形图是为每个组/变量绘制的,所以设置起来非常容易。x_data是一个组/变量的列表。Matplotlib函数boxplot()为y_data的每一列或y_data序列中的每个向量绘制箱形图;因此x_data中的每个值都对应于y_data的一列/向量。我们所要设置的就是图的美感。
箱形图示例
箱形图代码
def boxplot(x_data, y_data, base_color="#539caf", median_color="#297083", x_label="", y_label="", title=""):
_, ax = plt.subplots()
# Draw boxplots, specifying desired style
ax.boxplot(y_data
# patch_artist must be True to control box fill
, patch_artist = True
# Properties of median line
, medianprops = {'color': median_color}
# Properties of box
, boxprops = {'color': base_color, 'facecolor': base_color}
# Properties of whiskers
, whiskerprops = {'color': base_color}
# Properties of whisker caps
, capprops = {'color': base_color})
# By default, the tick label starts at 1 and increments by 1 for
# each box drawn. This sets the labels to the ones we want
ax.set_xticklabels(x_data)
ax.set_ylabel(y_label)
ax.set_xlabel(x_label)
ax.set_title(title)
叠加条形图对于可视化不同变量的分类构成非常有用。在下面的叠加条形图中,我们正在比较每天的服务器负载。通过彩色编码的堆积图,我们可以很容易地看到并理解哪些服务器在每一天工作得最多,以及这些负载与其他服务器在所有日子里的比较。这方面的代码与分组条形图的风格相同。我们循环浏览每一组,只是这次我们把新条形图画在旧条形图的上面,而不是在它们旁边。
普通条形图
分组条形图
叠加条形图
箱形图
总结
这就是你使用Matplotlib进行的5个快速而简单的数据可视化。把事情抽象成函数,总是能让你的代码更容易阅读和使用! 我希望你喜欢这篇文章,并学到一些新的有用的东西。
本文由mdnice多平台发布
网友评论