答案
This commit is contained in:
1 parent
ae0d509dbd
commit
029237b364
12 files changed
+1055
-116
No files matched your search
@@ -0,0 +1,136 @@
|
||||
"""
|
||||
任务描述
|
||||
|
||||
本关任务:利用世界银行发布的 1960—2009 年间的世界人口数据,来学习折线图的绘制。
|
||||
相关知识
|
||||
|
||||
为了完成本关任务,你需要掌握:
|
||||
|
||||
观察和处理数据;
|
||||
绘制折线图的基本步骤;
|
||||
折线图展示优化。
|
||||
|
||||
观察和处理数据
|
||||
|
||||
先导入必要的包pandas 、numpy和 matplotlib,用 pandas 中的read_csv()方法读取 csv 格式文件,创建一个图像和一个坐标轴。
|
||||
|
||||
import pandas as pd #导入pandas,用于生成满足绘图要求的数据格式
|
||||
from matplotlib import pyplot as plt #导入matplotlib,用于绘制折线图
|
||||
import numpy as np #导入numpy,用于展示横坐标
|
||||
population = pd.read_csv(r"LineChart/level1/csv/world-population.csv")
|
||||
|
||||
接下来查看数据,分别查看数据的前5行和后5行。
|
||||
|
||||
print(population.head())
|
||||
print(population.tail())
|
||||
|
||||
前5行数据如下:
|
||||
|
||||
Year Population
|
||||
0 1960 3028654024
|
||||
1 1961 3068356747
|
||||
2 1962 3121963107
|
||||
3 1963 3187471383
|
||||
4 1964 3253112403
|
||||
|
||||
后5行数据如下:
|
||||
|
||||
Year Population
|
||||
45 2005 6462054420
|
||||
46 2006 6538196688
|
||||
47 2007 6614396907
|
||||
48 2008 6692030277
|
||||
49 2009 6775235741
|
||||
|
||||
我们可以看到,数据中只有年份和人口数量两种数据。我们将年份用 x 轴表示,将人口数量用 y 轴表示,那么接下来就可以绘制折线图了。
|
||||
绘制折线图的基本步骤
|
||||
|
||||
首先简要介绍一下matplotlib.pyplot中的plot()方法:
|
||||
|
||||
plt.plot(x,y,format_string,**kwargs)
|
||||
|
||||
plt.plot()函数的本质就是根据点连接线。根据x(数组或者列表) 和 y(数组或者列表)组成点,然后连接成线,可以通过设置format_string选择画点还是画线。
|
||||
|
||||
x, y :x 是可选的,如果没有x,将默认是从 0 到 n - 1,也就是y的索引
|
||||
format_string :定义线条的颜色和样式的操作,如 o是圆圈, . 是圆点, +是加号 ,* 是星号, x 是 x 形
|
||||
**kwargs :可以用来指定很多内容,如 label 指定线条的标签, linewidth 指定线条的宽度等
|
||||
|
||||
接下来可以添加代码绘制折线图:
|
||||
|
||||
plt.plot(population["Year"],popultaion["Population"]) #绘制折线图
|
||||
plt.xlabel("Year", fontsize=12) #设置x轴标签
|
||||
plt.ylabel("Population", fontsize=12) #设置y轴标签
|
||||
plt.show() #展示图像
|
||||
|
||||
结果如图1所示:
|
||||
|
||||
|
||||
|
||||
图 1 默认的时间序列图表
|
||||
|
||||
从图中我们可以明显地看到,世界人口在随着时间同步增长。
|
||||
折线图展示优化
|
||||
|
||||
观察图1,我们发现x轴年份的默认显示过于稀疏,而且在一条平滑的直线上,难以锚点到具体的年份,能否按照我们的需求解决以上问题呢?当然可以!
|
||||
|
||||
#修改x轴坐标刻度,按10年的间隔划分
|
||||
my_x_ticks = np.arange(1960, 2011, 10)
|
||||
plt.xticks(my_x_ticks)
|
||||
|
||||
#添加网格
|
||||
plt.grid(b=True, color='r', linestyle='--', linewidth=1, alpha=0.3, axis='x', which="major")
|
||||
|
||||
#根据数据添加锚点,调整折线样式
|
||||
plt.plot(population["Year"],population["Population"], linewidth=1, c='red', marker='s', markersize=4, label='Y1') # 绘制y1
|
||||
|
||||
最终结果如图2所示:
|
||||
|
||||
|
||||
|
||||
图 2 优化后的时间序列图表
|
||||
编程要求
|
||||
|
||||
根据提示,在右侧编辑器 Begin - End 区间补充代码,绘制折线图,其中点用星号表示,颜色为"#00CC88",修改x轴坐标刻度,按5年的间隔划分,其他参数参考上方说明设置。
|
||||
测试说明
|
||||
|
||||
平台会对你编写的代码进行测试,如果你的图形与正确答案图形一致,则通关。
|
||||
图片预期输出示例:
|
||||
|
||||
|
||||
|
||||
开始你的任务吧,祝你成功!
|
||||
"""
|
||||
|
||||
# -*- coding: utf-8 -*-
|
||||
import pandas as pd #用于生成满足绘图要求的数据格式
|
||||
import numpy as np #用于展示横坐标
|
||||
from matplotlib import pyplot as plt #用于绘制折线图
|
||||
|
||||
population = pd.read_csv(r"LineChart/level1/csv/world-population.csv") #返回值为二维标记数据结构 DataFrame
|
||||
def plot():
|
||||
# ********* Begin *********#
|
||||
#(1)修改x轴坐标刻度,按5年的间隔划分(复制左边任务区示例代码,将10改为5)
|
||||
my_x_ticks = np.arange(1960, 2011, 5)
|
||||
plt.xticks(my_x_ticks)
|
||||
|
||||
#(2)添加网格(复制左边任务区示例代码)
|
||||
plt.grid(True, color='r', linestyle='--', linewidth=1, alpha=0.3, axis='x', which="major")
|
||||
|
||||
#(3)画折线图,x轴是年份(population['Year']),y轴是人口(population['Population']),线条宽度为1,颜色为'#00CC88',点用星号表示
|
||||
#(复制左边任务区示例代码,再按要求修改)
|
||||
plt.plot(population["Year"], population["Population"], linewidth=1, c='#00CC88', marker='*', markersize=4, label='Y1')
|
||||
|
||||
# (4)设置x轴标签为'Year',y轴标签为'Population',字体大小全部是12
|
||||
plt.xlabel("Year", fontsize=12)
|
||||
plt.ylabel("Population", fontsize=12)
|
||||
|
||||
# (5)直接显示图像
|
||||
plt.show()
|
||||
|
||||
# ********* End *********#
|
||||
plt.savefig('LineChart/level1/studentanswer/world-population.png') #保存为png格式
|
||||
plt.close() #关闭画布窗口
|
||||
|
||||
#直接运行本文件时显示图像(被平台导入时不会重复绘图)
|
||||
if __name__ == "__main__":
|
||||
plot()
|
||||
Reference in new issue
Block a user