文章目录

  • 1. 二维数组的索引
  • 2. npz文件
  • 3. 散点图的绘制


在Python数据分析与应用中有一个散点图的例子,做这个例子之前首先要弄清楚两个点:

  1. 对二维数组进行取数操作
  2. python中的npz文件

1. 二维数组的索引

二维数组中的每一个元素通过行和列两个坐标共同锁定,因此取某个元素的时候,需要同时给定行和列来指定某个元素。

例:假设变量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])

2. npz文件

例子中,绘制散点图的时候,导入了一个.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']

这里显示该数据集中有两个数据文件,columnsvalues

之后就可以通过name = datas['columns']赋值,此时name对象就是columns数据对象,然后对数据集对象name进行操作即可。


3. 散点图的绘制

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()

python 绘制二维图 python绘制二维散点图_数据

这里解释两个比较难理解的点:
首先是图像的绘制过程:
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隐藏了,没有显示在刻度线上而已。