最后,我们再添加一些更早的历史数据,以突出过去 60 年的人口爆炸。我在维基百科上找到了 1800、1850 和 1900 年的世界人口数据。我把它们写成列表,并用加号把它们拼接到 pop 和 year 列表前面。再次运行脚本,图上会新增三个数据点,画面更完整。就这样,我们把一张普通的折线图,打造成了一个故事清晰的可视化!轮到您了。前往练习,逐步自定义这张世界发展图,成为下一位 Hans Rosling!
import matplotlib.pyplot as plt
import pandas as pd
year =list(range(1950,2101))
pop =[2.53,2.57,2.62,2.67,2.71,2.76,2.81,2.86,2.92,2.97,3.03,3.08,3.14,3.2,3.26,3.33,3.4,3.47,3.54,3.62,3.69,3.77,3.84,3.92,4.,4.07,4.15,4.22,4.3,4.37,4.45,4.53,4.61,4.69,4.78,4.86,4.95,5.05,5.14,5.23,5.32,5.41,5.49,5.58,5.66,5.74,5.82,5.9,5.98,6.05,6.13,6.2,6.28,6.36,6.44,6.51,6.59,6.67,6.75,6.83,6.92,7.,7.08,7.16,7.24,7.32,7.4,7.48,7.56,7.64,7.72,7.79,7.87,7.94,8.01,8.08,8.15,8.22,8.29,8.36,8.42,8.49,8.56,8.62,8.68,8.74,8.8,8.86,8.92,8.98,9.04,9.09,9.15,9.2,9.26,9.31,9.36,9.41,9.46,9.5,9.55,9.6,9.64,9.68,9.73,9.77,9.81,9.85,9.88,9.92,9.96,9.99,10.03,10.06,10.09,10.13,10.16,10.19,10.22,10.25,10.28,10.31,10.33,10.36,10.38,10.41,10.43,10.46,10.48,10.5,10.52,10.55,10.57,10.59,10.61,10.63,10.65,10.66,10.68,10.7,10.72,10.73,10.75,10.77,10.78,10.79,10.81,10.82,10.83,10.84,10.85]
pop =[1,1.262,1.650]+ pop
year =[1800,1850,1900]+ year
plt.plot(year, pop)
plt.xlabel('Year')
plt.ylabel('Population')
plt.title('World Population Projections')
plt.yticks([0,2,4,6,8,10],['0','2B','4B','6B','8B','10B'])
plt.show()技术支持
课程节选:数据科学中级 Python - Matplotlib
以下为 数据科学中级 Python 课程第一章的视频与文字稿节选。完整章节(含互动练习)请见此处。
使用 matplotlib 绘制基础图表
您好,我叫 Filip,是 DataCamp 的数据科学家。在这门中级 Python 课程中,您将进一步提升用于数据科学的Python 技能。您将学习如何可视化数据,并用新的数据结构来存储数据。在此过程中,您会掌握控制结构,以便自定义脚本和算法的执行流程。我们会在本章结尾通过一个案例研究收尾,把您学到的一切融会贯通,解决一个很酷的问题。
第一章将聚焦于数据可视化,这是数据分析中非常重要的一部分。首先,您会持续用它来探索数据集。您越了解数据,就越能提炼出洞见。而当您找到了这些洞见后,仍然需要用可视化将宝贵的见解分享给他人。比如,请看这张漂亮的图。
它出自瑞典教授 Hans Rosling。他关于全球发展的问题演讲拥有数百万次观看。让这些演讲如此引人入胜的原因在于,他用精美的图表让数据自己“讲故事”。这里是一张气泡图,每个气泡代表一个国家。气泡越大,人口越多,因此最大的两个气泡是中国和印度。
图上有两条坐标轴。横轴表示人均 GDP(美元),纵轴表示预期寿命。我们可以清楚地看到,人均 GDP 较高的国家,人们的寿命通常更长。不过,同一收入水平的国家之间,预期寿命仍存在巨大差异。
为什么要说这些呢?因为在本章结束时,您就能亲手构建这样一张漂亮的图。
Python 中有许多可视化库,而其中的“祖师级”库就是
matplotlib。您需要使用它的子包pyplot。按照惯例,这个子包会以plt的别名导入,像这样。在第一个示例中,让我们尝试了解世界人口的变化。我这里有一个年份列表 year,以及一个对应的人口列表 pop(以十亿为单位)。例如,在 1970 年,地球上的人口约为 37 亿。
要将这些数据绘制为折线图,我们调用 plt.plot(),并将两个列表作为参数。第一个参数对应横轴,第二个参数对应纵轴。您也许认为图现在就会弹出,但 Python 有点“懒”。它会等到调用
show()函数时才真正显示图表。这是因为在显示之前,您可能还想添加标题或轴标签等“配料”。我稍后会再展开。请记住这一点:plot()函数告诉 Python“画什么”和“怎么画”,而show()则负责真正显示图表。观察图表我们会发现,横轴确实是年份,纵轴是人口。有四个数据点,Python 用一条线将它们连接起来。1950 年,世界人口约为 25 亿;2010 年,约为 70 亿。六十年间,世界人口几乎增长了三倍,这相当吓人。如果人口继续这样增长呢?世界会不会过度膨胀?这些问题,您将在练习中进一步探索。
我先介绍另一种图表:散点图。可以在之前代码的基础上创建,这次只需把 plot 函数改为 scatter。生成的散点图会把每个数据点单独绘出;Python 不会用线把点连起来。对于很多场景,散点图比折线图更合适,所以请记住这个 scatter 函数。也可以说,这是一种更“诚实”的可视化方式,因为它清楚地表明,这张图只基于四个数据点。
现在我们已经掌握了
matplotlib的基础,是时候由您来绘制一些很棒的图表了!直方图
在本视频中,我将介绍直方图。直方图是一种非常适合探索数据的可视化方式。它能帮助您了解变量的分布情况。为了说明其原理,想象在 0 到 6 之间有 12 个数值。我把它们放在一条数轴上。要为这些值构建直方图,可以把数轴分成若干等宽区间,称为“箱”(bins)。假设我们分成 3 个箱,每个箱宽度为 2。接着,统计每个箱内的数据点数量。第一个箱有 4 个点,第二个箱有 6 个点,第三个箱有 2 个点。最后,为每个箱画一个条形,条形的高度对应该箱中的数据点数量。结果就是一张直方图,它为这 12 个数值的分布提供了清晰概览。大多数值集中在中间,但小于 2 的值多于大于 4 的值。
当然,
matplotlib也能绘制直方图。与之前一样,先导入matplotlib中的pyplot包。然后可以使用hist()函数。我们打开文档看看。参数很多,但最重要的是前两个。x应该是您要绘制直方图的数值列表。第二个参数bins用来告诉 Python 要把数据分成多少个箱。基于这个数字,hist()会自动计算出合适的箱边界,并统计每个箱里的值的数量。如果您不指定bins参数,默认值是 10。要生成刚才那张直方图,先构建一个包含 12 个值的列表。接着,简单调用
hist(),把这个列表作为输入传入,对应参数x。我还把bins参数设置为 3,将这些值分成三个箱。最后调用 show 函数,就会得到一张漂亮的直方图。直方图非常适合把握全局。举个例子,看看这张所谓的人口金字塔。它展示了欧盟男性与女性的年龄分布。注意直方图被旋转了 90 度;箱现在是水平的。40 到 44 岁这个区间的箱最大,男性和女性各有 2000 万人。这一代人被称为“婴儿潮一代”。这些数据来自 2010 年。您觉得到了 2050 年会发生什么变化?我们来看看。分布变得更平坦,婴儿潮一代变得更年长。只需一扫而过,您就能看出人口结构如何随时间变化。这就是直方图的力量!现在前往练习,亲自尝试直方图吧!
自定义
画出一张图是一回事,做出能清晰传达信息的“正确”图才是真正的挑战。每一种可视化都有很多选择。首先是不同的图表类型;其次,对每张图,您都可以进行无数种自定义。您可以更改颜色、形状、标签、坐标轴等。选择取决于两点:其一,数据;其二,您想用这些数据讲述的故事。由于可自定义的内容太多,学习它们的最佳方式就是通过例子。
我们先用这段脚本中的代码绘制一张简单的折线图。它与第一段视频中的折线图类似,但这次 year 和 pop 列表包含了更多数据,包括联合国对 2100 年之前的人口预测。如果我们运行脚本,已经能得到一张相当不错的图:它显示出到本世纪末,正在发生的人口爆炸将会放缓。
但有些地方还可以改进。首先,应该更清楚地说明我们展示的数据是什么,尤其是对第一次看到图的人。其次,图表需要把注意力真正引向人口爆炸。第一件总是要做的事是给坐标轴加标签。我们来添加
xlabel()和ylabel()函数。作为输入,传入要放在坐标轴旁边的字符串。请务必在调用show()之前调用这些函数,否则自定义内容不会显示。再次运行脚本,这次坐标轴已有标注。我们还要用 title 函数为图表添加标题。把实际标题“World Population Projections”作为参数传入。标题就出现了!通过
xlabel、ylabel和title,我们可以为读者提供更多关于图上数据的信息:至少现在他们能知道这张图讲的是什么。为了更好地体现人口增长,我想让 y 轴从零开始。可以使用函数。第一个输入是一个列表,比如这里是从 0 到 10,步长为 2。运行后,图形会改变:曲线整体上移。现在能更清楚地看到,早在 1950 年,这个星球上就已经有大约 25 亿人。yticks()接下来,为了说明单位是十亿,我们可以给
yticks()函数传入第二个参数,即一个刻度显示名称的列表。它的长度应与第一个列表相同。刻度 0 显示为 0,刻度 2 显示为 2B,刻度 4 显示为 4B,依此类推。顺带一提,这里的 B 指的是 Billion(十亿)。再次运行脚本,标签会相应变化,很好。最后,我们再添加一些更早的历史数据,以突出过去 60 年的人口爆炸。我在维基百科上找到了 1800、1850 和 1900 年的世界人口数据。我把它们写成列表,并用加号把它们拼接到
pop和year列表前面。再次运行脚本,图上会新增三个数据点,画面更完整。就这样,我们把一张普通的折线图,打造成了一个故事清晰的可视化!轮到您了。前往练习,逐步自定义这张世界发展图,成为下一位 Hans Rosling!