Python使用Matpoltlib绘制散点图一次和二次拟合线

24 阅读1分钟

引入依赖

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

显示中文、负号、字体大小、指定子图位置

plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号'-'显示为方块的问题
plt.rcParams['font.size'] = 18
ax = plt.axes([0.1, 0.1, 0.8, 0.8])

数据预处理

# 读取数据,预处理
data = pd.read_csv('./study_performance.csv')
data['average_score'] = data[['math_score', 'reading_score', 'writing_score']].mean(axis=1)

math_scores = data['math_score']
average_scores = data['average_score']

绘制散点图

# 绘制散点图
plt.scatter(math_scores, average_scores, label='Data Points')

# 进行一次拟合
p1 = np.polyfit(math_scores, average_scores, 1)
p1_line = np.poly1d(p1)
plt.plot(math_scores, p1_line(math_scores), 'r-', label='Linear Fit')

# 进行二次拟合
p2 = np.polyfit(math_scores, average_scores, 2)
p2_line = np.poly1d(p2)
x_fit = np.linspace(min(math_scores), max(math_scores), 100)  # 创建拟合线使用的x值
plt.plot(x_fit, p2_line(x_fit), 'g--', label='Quadratic Fit')

plt.title('The effect of math scores on average scores')
plt.xlabel('Average')
plt.ylabel('Math_Score')
# 隐藏右上边框
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)

# 显示图形
plt.show()

效果图

散点图+拟合线.png