Mục tiêu thực hành
- Nắm vững các phương pháp điều chỉnh tham số vẽ đồ thị phổ biến trong pyplot;
- Nắm vững phương pháp cơ bản để tạo subplot;
- Nắm vững phương pháp lưu và hiển thị đồ thị;
- Nắm vững vai trò và phương pháp vẽ biểu đồ phân tán, biểu đồ đường, biểu đồ cột, biểu đồ tròn.
Yêu cầu thực hành
- Hoàn thành các phần mã 3.1-3.3, yêu cầu bao gồm các nội dung biểu đồ phân tán, biểu đồ đường, biểu đồ cột, biểu đồ tròn và phương pháp subplot theo mục tiêu thực hành;
- Viết báo cáo thực hành, nội dung yêu cầu có mã Python và kết quả thực hành
- Khuyến khích đưa ra các triển khai mã khác nhau, tối ưu hơn.
Nội dung thực hành
- Hoàn thành nhiệm vụ yêu cầu 1, đồng thời hiển thị dữ liệu国民经济核算季度数据.npz dưới dạng tệp văn bản hoặc tệp Excel;
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei' # Thiết lập hiển thị tiếng Trung
plt.rcParams['axes.unicode_minus'] = False
data = np.load('D:/workspath/国民经济核算季度数据.npz', allow_pickle=True)
column_names = data['columns'] # Trích xuất mảng columns, coi là nhãn dữ liệu
data_values = data['values'] # Trích xuất mảng values, vị trí lưu trữ dữ liệu
print(column_names)
print(data_values)
# Biểu đồ phân tán
plt.figure(figsize=(8, 7)) # Thiết lập canvas
plt.scatter(data_values[:, 0], data_values[:, 2], marker='o') # Vẽ biểu đồ phân tán
plt.xlabel('Năm') # Thêm nhãn trục ngang
plt.ylabel('Tổng sản phẩm (tỷ nhân dân tệ)') # Thêm tên trục y
plt.xticks(range(0, 70, 4), data_values[range(0, 70, 4), 1], rotation=45)
plt.title('Biểu đồ phân tán tổng sản phẩm quý 2000-2017') # Thêm tiêu đề biểu đồ
plt.savefig("./Biểu đồ phân tán tổng sản phẩm quý 2000-2017.png")
# Biểu đồ cột
sector_labels = ['Ngành thứ nhất', 'Ngành thứ hai', 'Ngành thứ ba'] # Nhãn trục 1
industry_labels = ['Nông nghiệp', 'Công nghiệp', 'Xây dựng', 'Bán buôn', 'Giao thông',
'Nhà hàng', 'Tài chính', 'Bất động sản', 'Khác'] # Nhãn trục 2
fig = plt.figure(figsize=(12, 12))
ax1 = fig.add_subplot(2, 2, 1)
plt.bar(range(3), data_values[0, 3:6], width=0.5)
plt.xlabel('Ngành')
plt.ylabel('Tổng sản phẩm (tỷ nhân dân tệ)')
plt.xticks(range(3), sector_labels)
plt.title('Biểu đồ cột phân phối tổng sản phẩm quốc dân quý I năm 2000')
ax2 = fig.add_subplot(2, 2, 2)
plt.bar(range(3), data_values[-1, 3:6], width=0.5)
plt.xlabel('Ngành')
plt.ylabel('Tổng sản phẩm (tỷ nhân dân tệ)')
plt.xticks(range(3), sector_labels)
plt.title('Biểu đồ cột phân phối tổng sản phẩm quốc dân quý I năm 2017')
ax3 = fig.add_subplot(2, 2, 3)
plt.bar(range(9), data_values[0, 6:], width=0.5)
plt.xlabel('Ngành')
plt.ylabel('Tổng sản phẩm (tỷ nhân dân tệ)')
plt.xticks(range(9), industry_labels)
plt.title('Biểu đồ cột phân phối tổng sản phẩm quốc dân quý I năm 2000')
ax4 = fig.add_subplot(2, 2, 4)
plt.bar(range(9), data_values[-1, 6:], width=0.5)
plt.xlabel('Ngành')
plt.ylabel('Tổng sản phẩm (tỷ nhân dân tệ)')
plt.xticks(range(9), industry_labels)
plt.title('Biểu đồ cột phân phối tổng sản phẩm quốc dân quý I năm 2017')
plt.savefig('./Biểu đồ cột phân phối tổng sản phẩm quốc dân.png')
# Biểu đồ tròn
explode1 = [0.01, 0.01, 0.01]
explode2 = [0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01]
fig = plt.figure(figsize=(12, 12))
ax1 = fig.add_subplot(2, 2, 1)
plt.pie(data_values[0, 3:6], explode=explode1, labels=sector_labels,
autopct='%1.1f%%')
plt.title('Biểu đồ tròn phân phối tổng sản phẩm quốc dân quý I năm 2000')
ax2 = fig.add_subplot(2, 2, 2)
plt.pie(data_values[-1, 3:6], explode=explode1, labels=sector_labels,
autopct='%1.1f%%')
plt.title('Biểu đồ tròn phân phối tổng sản phẩm quốc dân quý I năm 2017')
ax3 = fig.add_subplot(2, 2, 3)
plt.pie(data_values[0, 6:], explode=explode2, labels=industry_labels,
autopct='%1.1f%%')
plt.title('Biểu đồ tròn phân phối tổng sản phẩm quốc dân quý I năm 2000')
ax4 = fig.add_subplot(2, 2, 4)
plt.pie(data_values[-1, 6:], explode=explode2, labels=industry_labels,
autopct='%1.1f%%')
plt.title('Biểu đồ tròn phân phối tổng sản phẩm quốc dân quý I năm 2017')
plt.savefig('./Biểu đồ tròn phân phối tổng sản phẩm quốc dân.png')
# Biểu đồ hộp
gdp_data = (list(data_values[:, 3]), list(data_values[:, 4]), list(data_values[:, 5]))
plt.figure(figsize=(6, 4))
plt.boxplot(gdp_data, notch=True, labels=sector_labels, meanline=True)
plt.title('Biểu đồ hộp tổng sản phẩm quốc dân các ngành 2000-2017')
plt.savefig('./Biểu đồ hộp tổng sản phẩm quốc dân các ngành 2000-2017.png')
plt.show()
- Phân tích mối quan hệ giữa các đặc điểm dữ liệu dân số trong populations.npz từ 1996-2015
(1) Sử dụng thư viện Numpy để đọc dữ liệu dân số;
(2) Tạo canvas và thêm subplot;
(3) Vẽ biểu đồ phân tán và biểu đồ đường riêng biệt và lưu hình ảnh;
(4) Phân tích xu hướng thay đổi dân số trong tương lai.
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
data = np.load('D:/workspath/populations.npz', allow_pickle=True)
def extract_keys(data):
keys_list = []
for key in data.keys():
keys_list.append(key)
return keys_list
keys = extract_keys(data)
column_names = data[keys[1]]
data_values = data[keys[0]][-3::-1, :]
print(column_names, '\n', data_values)
fig1 = plt.figure(figsize=(14, 7))
ax1 = fig1.add_subplot(1, 2, 1)
plt.title('Biểu đồ phân tán mối quan hệ giữa các đặc điểm dữ liệu dân số 1996-2015')
plt.xlabel('Năm')
plt.ylabel('Dân số (vạn người)')
plt.xticks(range(0, 20), data_values[:, 0], rotation=45)
plt.scatter(data_values[:, 0], data_values[:, 1], marker='o', c='r')
plt.scatter(data_values[:, 0], data_values[:, 2], marker='D', c='b')
plt.scatter(data_values[:, 0], data_values[:, 3], marker='h', c='g')
plt.scatter(data_values[:, 0], data_values[:, 4], marker='s', c='y')
plt.scatter(data_values[:, 0], data_values[:, 5], marker='*', c='c')
plt.legend(['Tổng dân số cuối năm', 'Dân số nam', 'Dân số nữ', 'Dân số thành thị', 'Dân số nông thôn'])
plt.savefig('D:/workspath/1996-2015 mối quan hệ giữa các đặc điểm dữ liệu dân số.png')
# Biểu đồ đường
ax2 = fig1.add_subplot(1, 2, 2)
plt.title('Biểu đồ đường mối quan hệ giữa các đặc điểm dữ liệu dân số 1996-2015')
plt.xlabel('Năm')
plt.ylabel('Dân số (vạn người)')
plt.xticks(range(0, 20), data_values[:, 0], rotation=45)
plt.plot(data_values[:, 0], data_values[:, 1], 'rs-', data_values[:, 0], data_values[:, 2], 'bd-.',
data_values[:, 0], data_values[:, 3], 'gh--', data_values[:, 0], data_values[:, 4], 'y*:',
data_values[:, 0], data_values[:, 5], 'cv-.')
plt.legend(['Tổng dân số cuối năm', 'Dân số nam', 'Dân số nữ', 'Dân số thành thị', 'Dân số nông thôn'])
plt.savefig('D:/workspath/1996~2015 mối quan hệ giữa các đặc điểm dữ liệu dân số.png')
plt.show()
- Phân tích phân phối và sự phân tán của các đặc điểm dữ liệu dân số trong populations.npz từ 1996-2015.
(1) Nắm vững phương pháp vẽ biểu đồ cột, biểu đồ tròn và biểu đồ hộp;
(2) Phân tích và phát hiện sự thay đổi cơ cấu dân số.
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
data = np.load('D:/workspath/populations.npz', allow_pickle=True)
def extract_keys(data):
keys_list = []
for key in data.keys():
keys_list.append(key)
return keys_list
keys = extract_keys(data)
column_names = data[keys[1]]
data_values = data[keys[0]][-3::-1, :]
print(column_names, '\n', data_values)
# Biểu đồ cột
fig1 = plt.figure(figsize=(15, 15)) # Thiết lập canvas
fig1.add_subplot(2, 1, 1)
plt.bar(range(4), data_values[0, 2:6], width=0.6)
plt.xlabel('Loại'), plt.ylabel('Dân số (vạn người)')
plt.xticks(range(4), column_names[2:6])
plt.title('Biểu đồ cột mối quan hệ giữa các đặc điểm dữ liệu dân số năm 1996')
fig1.add_subplot(2, 1, 2)
plt.bar(range(4), data_values[-1, 2:6], width=0.6)
plt.xlabel('Loại'), plt.ylabel('Dân số (vạn người)')
plt.xticks(range(4), column_names[2:6])
plt.title('Biểu đồ cột mối quan hệ giữa các đặc điểm dữ liệu dân số năm 2015')
plt.savefig('./Biểu đồ cột mối quan hệ giữa các đặc điểm dữ liệu dân số năm 1996 và 2015.png')
# Biểu đồ tròn
fig2 = plt.figure(figsize=(15, 15)) # Thiết lập canvas
explode = np.linspace(0.01, 0.01, 4)
fig2.add_subplot(2, 1, 1)
plt.title('Biểu đồ tròn mối quan hệ giữa các đặc điểm dữ liệu dân số năm 1996')
plt.pie(data_values[0, 2:6], explode=explode, labels=column_names[2:6], autopct='%1.1f%%')
fig2.add_subplot(2, 1, 2)
plt.title('Biểu đồ tròn mối quan hệ giữa các đặc điểm dữ liệu dân số năm 2015')
plt.pie(data_values[-1, 2:6], explode=explode, labels=column_names[2:6], autopct='%1.1f%%')
plt.savefig('./Biểu đồ tròn mối quan hệ giữa các đặc điểm dữ liệu dân số năm 1996 và 2015.png')
# Biểu đồ hộp
fig2 = plt.figure(figsize=(8, 8)) # Thiết lập canvas
plt.title('Biểu đồ hộp mối quan hệ giữa các đặc điểm dữ liệu dân số 1996-2015')
population_data = (list(data_values[:, 2]), list(data_values[:, 3]), list(data_values[:, 4]), list(data_values[:, 5]))
plt.boxplot(population_data, notch=True, labels=column_names[2:6], meanline=True)
plt.savefig('./Biểu đồ hộp mối quan hệ giữa các đặc điểm dữ liệu dân số 1996~2015.png')
plt.show()
- Phân tích dữ liệu nấm sơ bộ từ Mushroom.csv
(1) Sử dụng biểu đồ cột để hiển thị phân phối màu nắp nấm, phân phối mùi nấm;
(2) Sử dụng biểu đồ cột để hiển thị phân phối màu nấm có độc, phân phối mùi nấm có độc;
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
df = pd.read_csv('D:/workspath/mushrooms.csv')
# Phân phối màu nắp nấm
plt.figure(figsize=(10, 5)) # Thiết lập kích thước
df['cap-color'].value_counts().plot(kind='bar', color='skyblue')
plt.title('Phân phối màu nắp nấm')
plt.xlabel('Màu nắp')
plt.ylabel('Số lượng')
plt.savefig('./Biểu đồ cột phân phối màu nắp nấm.png')
# Phân phối mùi nấm
plt.figure(figsize=(10, 5))
df['odor'].value_counts().plot(kind='bar', color='lightgreen')
plt.title('Phân phối mùi nấm')
plt.xlabel('Mùi nấm')
plt.ylabel('Số lượng')
plt.savefig('./Biểu đồ cột phân phối mùi nấm.png')
# Phân phối màu nấm có độc
poisonous_df = df[df['class'] == 'p']
plt.figure(figsize=(10, 5))
poisonous_df['cap-color'].value_counts().plot(kind='bar', color='salmon')
plt.title('Phân phối màu nấm có độc')
plt.xlabel('Màu nắp')
plt.ylabel('Số lượng')
plt.savefig('./Biểu đồ cột phân phối màu nấm có độc.png')
# Phân phối mùi nấm có độc
plt.figure(figsize=(10, 5))
poisonous_df['odor'].value_counts().plot(kind='bar', color='coral')
plt.title('Phân phối mùi nấm có độc')
plt.xlabel('Mùi nấm')
plt.ylabel('Số lượng')
plt.savefig('./Biểu đồ cột phân phối mùi nấm có độc.png')
plt.show()