Matplotlib: Nền tảng trực quan hóa dữ liệu cơ bản trong Python

Mục tiêu thực hành

  1. Nắm vững các phương pháp điều chỉnh tham số vẽ đồ thị phổ biến trong pyplot;
  2. Nắm vững phương pháp cơ bản để tạo subplot;
  3. Nắm vững phương pháp lưu và hiển thị đồ thị;
  4. 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

  1. 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;
  2. 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
  3. 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

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

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

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

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

Thẻ: matplotlib python Trực quan hóa dữ liệu numpy Pandas

Đăng vào ngày 4 tháng 7 lúc 13:47