python科学计算实验2

1. 以“populations.npz”为素材,完成(a)、(b)题目的要求。(本题要求在绘图之前,先进行数据处理:删去全为“nan”的行,然后按年份“从小到大”排序)

(a) 绘制总人口线形图。x轴是“年份”,从起始年开始,每隔4年绘制一个刻度。

(b) 绘制多序列垂直条形图,包括2个子图。第1个子图为“男女人口”,第2个子图为“城乡人口”。x轴上的序列为:2000年,2005年,2010年和2015年。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib

loaded_data = np.load(r"D:\A学习\python科学计算\实验\2\data\populations.npz", allow_pickle=True)
kdata, kfeature_names = loaded_data.keys()
#print(loaded_data[kfeature_names])
#print(loaded_data[kdata])
# data = np.delete(loaded_data[kdata], [-1, -2], axis=0)
data = loaded_data[kdata][:-2]
data = data[np.argsort(data[:, 0])]
#print(data)

matplotlib.rcParams['font.family'] = 'KaiTi'
year = []
for temp in data[:, 0]:
    year.append(int(temp.rstrip("年")))
plt.plot(year, data[:, 1], 'ko-')
plt.xlabel("年份")
plt.ylabel("人口(万人)")
xlable = list(range(1996, 2016, 4))
xl = [str(i) + "年" for i in xlable]
plt.xticks(xlable, xl)
plt.title("人口增长趋势曲线图")
plt.legend(["总人口"])

plt.figure(figsize=(6, 7.5))
plt.subplot(2, 1, 1)
plt.title("男女人口对比条形图")
plt.ylabel("人口(万人)")
man = data[[i for i in range(4, 20, 5)], 2]
woman = data[[i for i in range(4, 20, 5)], 3]
x = list(range(2000, 2016, 5))
plt.ylim(0,90000)
plt.xlim(1998,2020)
labx = [str(i) + "年" for i in x]
bw =0.9
plt.xticks([i + bw for i in x], labx)
plt.yticks(list(range(0, 100000, 20000)))
plt.bar(x, man, color='r', width=1.8)
plt.bar([i + 2 * bw for i in x], woman, color='y', width=1.8)
for a, b in zip(x, man):
    plt.text(a, b + 100, '%s' % int(b), ha='center')
for a, b in zip(x, woman):
    plt.text(a + 2 * bw, b + 100, '%s' % int(b), ha='center')
plt.legend(["男", "女"])

plt.subplot(2, 1, 2)
plt.title("城乡人口对比条形图")
plt.ylabel("人口(万人)")
plt.ylim(0,105000)
city = data[[i for i in range(4, 20, 5)], 4]
country = data[[i for i in range(4, 20, 5)], 5]
plt.xticks([i + bw for i in x], labx)
plt.yticks(list(range(0, 100000, 20000)))
plt.bar(x, city, color='g', width=1.8)
plt.bar([i + 2 * bw for i in x], country, color='b', width=1.8)
for a, b in zip(x, city):
    plt.text(a, b + 100, '%s' % int(b), ha='center')
for a, b in zip(x, country):
    plt.text(a + 2 * bw, b + 100, '%s' % int(b), ha='center')
plt.legend(["城镇", "乡村"])
plt.show()

 

 2. 以“国民经济核算季度数据.npz”为素材,绘制饼图,包括4个子图(2×2)。第1,2个子图分别为2000年和2017年第一季度3个产业的GDP贡献额;第3,4个子图分别为2000年和2017年第一季度各行业的GDP贡献额。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib

loaded_data = np.load(r"D:\A学习\python科学计算\实验\2\data\国民经济核算季度数据.npz", allow_pickle=True)
kfeature_names, kdata = loaded_data.keys()
# print(loaded_data[kdata])
#print(loaded_data[kfeature_names])
data = loaded_data[kdata]
matplotlib.rcParams['font.family'] = 'KaiTi'
plt.figure(figsize=(8, 8))

plt.subplot(2, 2, 1)
data1 = data[0, [3, 4, 5]]
plt.title("2000年第一季度GDP产业构成分布图")
labels = ("第一产业", "第二产业", "第三产业")
plt.pie(data1, labels=labels, autopct='%1.1f%%', explode=(0.01, 0.01, 0.01))

plt.subplot(2, 2, 2)
data2 = data[-1, [3, 4, 5]]
plt.title("2017年第一季度GDP产业构成分布图")
labels = ("第一产业", "第二产业", "第三产业")
plt.pie(data2, labels=labels, autopct='%1.1f%%', explode=(0.01, 0.01, 0.01))

plt.subplot(2, 2, 3)
data3 = data[0, [i for i in range(6, 15)]]
plt.title("2000年第一季度GDP行业构成分布图")
labels = ("农业", "工业", "建筑", "批发", "交通", "餐饮", "金融", "房地产", "其他")
explode = (0, 0, 0, 0, 0, 0, 0.03, 0, 0.03)
plt.pie(data3, labels=labels, autopct='%1.1f%%', explode=explode, startangle=120, pctdistance=0.8)

plt.subplot(2, 2, 4)
data3 = data[-1, [i for i in range(6, 15)]]
plt.title("2017年第一季度GDP行业构成分布图")
explode = (0, 0, 0, 0, 0, 0, 0.03, 0, 0.03)
plt.pie(data3, labels=labels, autopct='%1.1f%%', explode=explode, startangle=120, pctdistance=0.8)
plt.show()

 3. 以“iris.npz”为素材,绘制散点图,包括4个子图(2×2)。4个子图分别为“萼片(sepal)长度-花瓣(petal)长度”、“萼片宽度-花瓣宽度”、“萼片长度-萼片宽度”、“花瓣长度-花瓣宽度”散点图。(为了便于分析数据,在每个子图中,要求用3种不同的颜色表示3种不同类别的花)

import numpy as np
import matplotlib.pyplot as plt
import matplotlib

loaded_data = np.load(r"D:\A学习\python科学计算\实验\2\data\iris.npz", allow_pickle=True)
kdata, kfeature_names = loaded_data.keys()
print(loaded_data[kfeature_names])
print(loaded_data[kdata])
data = loaded_data[kdata]
matplotlib.rcParams['font.family'] = 'KaiTi'
plt.figure(figsize=(8, 8))
plt.suptitle("鸢尾花多散点图一览", fontsize=20, y=0.93, fontproperties='LiSu')
colors = ['red', 'yellowgreen', 'lightskyblue']

plt.subplot(2, 2, 1)
speal_len_setosa = data[[i for i in range(50)], 0]
speal_len_versicolor = data[[i for i in range(50, 100)], 0]
speal_len_virginica = data[[i for i in range(100, 150)], 0]
petal_len_setosa = data[[i for i in range(50)], 2]
petal_len_versicolor = data[[i for i in range(50, 100)], 2]
petal_len_virginica = data[[i for i in range(100, 150)], 2]
plt.scatter(speal_len_setosa, petal_len_setosa, c='red')
plt.scatter(speal_len_versicolor, petal_len_versicolor, c='yellowgreen')
plt.scatter(speal_len_virginica, petal_len_virginica, c='blue')
plt.xlabel("萼片长度")
plt.ylabel("花瓣长度")
plt.legend(['山鸢尾', '变色鸢尾', '弗吉尼亚'])

plt.subplot(2, 2, 2)
speal_wid_setosa = data[[i for i in range(50)], 1]
speal_wid_versicolor = data[[i for i in range(50, 100)], 1]
speal_wid_virginica = data[[i for i in range(100, 150)], 1]
petal_wid_setosa = data[[i for i in range(50)], 3]
petal_wid_versicolor = data[[i for i in range(50, 100)], 3]
petal_wid_virginica = data[[i for i in range(100, 150)], 3]
plt.scatter(speal_wid_setosa, petal_wid_setosa, c='red')
plt.scatter(speal_wid_versicolor, petal_wid_versicolor, c='yellowgreen')
plt.scatter(speal_wid_virginica, petal_wid_virginica, c='blue')
plt.xlabel("萼片宽度")
plt.ylabel("花瓣宽度")
plt.legend(['山鸢尾', '变色鸢尾', '弗吉尼亚'])

plt.subplot(2, 2, 3)
plt.scatter(speal_len_setosa, speal_wid_setosa, c='red')
plt.scatter(speal_len_versicolor, speal_wid_versicolor, c='yellowgreen')
plt.scatter(speal_len_virginica, speal_wid_virginica, c='blue')
plt.xlabel("萼片长度")
plt.ylabel("萼片宽度")
plt.legend(['山鸢尾', '变色鸢尾', '弗吉尼亚'])

plt.subplot(2, 2, 4)
plt.scatter(petal_len_setosa, petal_wid_setosa, c='red')
plt.scatter(petal_len_versicolor, petal_wid_versicolor, c='yellowgreen')
plt.scatter(petal_len_virginica, petal_wid_virginica, c='blue')
plt.xticks(range(1,8))
plt.xlim(0.5,7.2)
plt.xlabel("花瓣长度")
plt.ylabel("花瓣宽度")
plt.legend(['山鸢尾', '变色鸢尾', '弗吉尼亚'])
plt.show()

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值