在Python数据分析与应用中有一个散点图的例子,做这个例子之前首先要弄清楚两个点:
二维数组中的每一个元素通过行和列两个坐标共同锁定,因此取某个元素的时候,需要同时给定行和列来指定某个元素。
例:假设变量x
指向了一个二维数组, 那么访问指定元素的格式就是
x[行坐标, 列坐标]
,注意坐标号从0开始
In [38]: x = np.array([[1,2,3], [4,5,6], [7,8,9]])
# 3行3行列
In [39]: x
Out[39]:
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
In [40]: x[:]
Out[40]:
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# 查看第一行
In [41]: x[0]
Out[41]: array([1, 2, 3])
# 查看第二行
In [42]: x[1]
Out[42]: array([4, 5, 6])
# 查看第一行
In [43]: x[0:1]
Out[43]: array([[1, 2, 3]])
# 查看前两行
In [44]: x[0:2]
Out[44]:
array([[1, 2, 3],
[4, 5, 6]])
# 查看前两行的第一列
In [45]: x[0:2, 0]
Out[45]: array([1, 4])
例子中,绘制散点图的时候,导入了一个.npz
的文件。要先弄明白他是什么。
npz: 数据集压缩文件,里面会包含一个或多个数据文件,就像zip压缩包一样。
那么python如何操作npz文件呢?
首先在python中导入npz文件
# 加上allow_pickle=True防止报错: Object arrays cannot be loaded when allow_pickle=False
datas = np.load('./data/国民经济核算季度数据.npz', allow_pickle=True)
然后利用.files
查看该数据集压缩包都包含哪些数据文件
print(datas.files)
# ['columns', 'values']
这里显示该数据集中有两个数据文件,columns
和values
。
之后就可以通过name = datas['columns']
赋值,此时name对象就是columns数据对象,然后对数据集对象name进行操作即可。
import numpy as np
import matplotlib.pyplot as plt
# 散点图函数scatter
plt.rcParams['font.sans-serif'] = 'SimHei'
datas = np.load('./data/国民经济核算季度数据.npz', allow_pickle=True)
# Object arrays cannot be loaded when allow_pickle=False
"""
查看npz中的数据集
以npz结尾的数据集是压缩文件,里面还有其他的文件
可通过 npz对象名.files查看npz都包含了哪些数据文件
print(datas.files)
输出其中的一个数据集查看其中的数据
x = datas['columns']
print(x)
"""
# print(datas['columns'])
# print(datas['values'])
name = datas['columns']
values = datas['values']
# 创建画布
plt.figure(figsize=(20, 8), dpi=80)
plt.scatter(values[:, 0], values[:, 2], marker='o')
# x 1-69
# y 与x对应也有70个值
'''
下面ticks虽然将刻度线化成4个一组, 但是散点图的数据是由scatter中的x和y决定的
因此,最终的结果是四个x及对应的y为一组,
即 最终的结果是,图示的刻度是4(有xticks决定),但是画图的精度是1(有scatter中的x y决定,x是one by one,因此y也是one by one)
'''
plt.xlabel('年份')
plt.ylabel('生产总值(亿元)')
plt.ylim((0, 225000))
plt.xticks(range(0, 70, 4), values[range(0, 70, 4), 1], rotation=45)
# roration 代表坐标中label的旋转角度
# plt.xticks(range(0, 70, 4))
plt.title('2000 ~ 2017年各季度国民生产总值散点图')
plt.show()
这里解释两个比较难理解的点:
首先是图像的绘制过程:
metaplotlib绘制图像采用的是描点法,即给出x和y的对应关系以及x的取值,然后通过计算y值进行描点。
而散点图的绘制依然如此,通过`scatter(x, y)`给出x和y,对于代码中`plt.scatter(values[:, 0], values[:, 2], marker='o')`
x参数接收的是`values`这个二维数组中所有行的第1列,因此x的最终取值是1-69即69个数字。
而y的取值是`values`这个二维数组中所有行中的第3列。
即最终的绘图结果是x和y一一对应的69个x对应了69个y点。
然后看xticks,plt.xticks(range(0, 70, 4), values[range(0, 70, 4), 1], rotation=45)
第一个参数range(0, 70, 4)
表示刻度的精度,即x的精度为0, 4, 8…
第二个参数values[range(0, 70, 4), 1]
,表示取出values二维数组中第0, 4, 8…行中的第2列,作为x轴每个刻度的标注。
rotation表示横坐标标注的旋转角度
因此, 虽然在绘图的时候,x是从1-69 one by one的(y与x对应),但是xticks将x轴以四个x值为一组,那么最终的显示结果就是每四个x为一个精度,即你会看到每个精度上有4个点,但其实是将其他三个x隐藏了,没有显示在刻度线上而已。