Python | 绘制散点图

文摘   2024-08-21 00:02   天津  



LXX

读完需要

2
分钟

速读仅需 1 分钟

前言:

散点图是由一些散乱的点组成的图表,每个点的具体位置,由其在坐标系中 X 值和 Y 值共同确定的,因此也叫做 XY 散点图。散点图用于数学学科的回归分析当中,当散点数据呈现某种趋势时,可以通过特定的函数进行拟合分析,进而研究数据的分布情况和预测未来数据的变化情况。本文分享粗略绘制散点图的方法。


希望各位同学点个关注,点个小赞,这将是更新的动力,不胜感激❥(^_-)

1

   

实现方法

1.1

   

散点图价值

1.散点图解决了大批近似数据的处理问题,大部分情况下,直接从数据看不出数据的整体分布情况和走势,而若通过绘制散点图,便可一目了然数据的发展情况。

2.散点图便于获取趋势公式:在数据的基础上绘制出的散点图,可以导出对应的趋势公式,便于后续的数据分析。

3.散点图是由 X、Y 坐标轴的具体值,定位每个点的具体位置,利用这一特点,可以辅助制作条形图;利用散点图的误差线辅助制作其他特定图表。

1.2

   

绘制方法

本文将使用 matplotlib.pyplot 模块中的 scatter 函数进行散点图绘制。

Matplotlib 是一个用于绘制数据可视化图形的 Python 库。它是 Python 生态系统中最流行和功能最强大的绘图库之一,可用于创建各种类型的图表,包括线图、散点图、柱状图、饼图、热力图等。Matplotlib 提供了丰富的定制选项,使用户能够创建高度定制的图形。

以下是 Matplotlib 的一些核心知识点:

1-Figure 和 Axes:Figure 是图形的最顶层容器,可以包含一个或多个 Axes。Axes 是图形中的子图,它包含了数据的绘制区域和坐标轴。

2-绘图函数:Matplotlib 提供了一系列函数来创建不同类型的图表,如 plt.plot()用于线图、plt.scatter()用于散点图、plt.bar()用于条形图、plt.pie()用于饼图等。

3-坐标轴和标签:使用 plt.xlabel()和 plt.ylabel()来设置坐标轴的标签。使用 plt.title()来设置图表的标题。

4-定制样式:可以通过参数设置来定制图表的颜色、线型、标记点、线宽等样式。使用 plt.legend()来添加图例,以区分不同数据系列。

5-子图和布局:使用 plt.subplot()来创建子图,以便在同一图中显示多个子图。使用 plt.tight_layout()来自动调整子图的布局。

6-保存图形:使用 plt.savefig()可以将图形保存为图像文件,如 PNG、JPEG 等。

7-常见图表类型:拆线图(Line Plot):用于显示数据的趋势。散点图(Scatter Plot):用于显示数据点的分布。条形图(Bar Chart):用于比较不同类别的数据。饼图(Pie Chart):用于表示数据的相对比例。直方图(Histogram):用于显示数据的分布情况。箱线图(Box Plot):用于显示数据的统计信息,如中位数、四分位数等。

8-自定义图形:Matplotlib 允许用户进行高度的定制,包括修改颜色、线型、字体、坐标轴范围等。

9-导入 Matplotlib:在使用 Matplotlib 之前,需要导入库,通常使用 import matplotlib.pyplot as plt。

10-交互式绘图:在 Jupyter Notebook 等交互式环境中,可以实时更新和修改图形。Matplotlib 的强大之处在于它的灵活性和可定制性,使你能够创建适合各种数据和需求的图形。同时,Matplotlib 有一个庞大的社区支持,提供了大量的文档和示例代码,可帮助用户学习和解决问题。

2

   

绘制代码及结果

import numpy as npimport matplotlib.pyplot as pltfrom scipy import stats
# 创建随机数n = 1000x = np.random.uniform(20, 160, n)y = 0.82 * x + 7.68 + np.random.normal(0, 10, n)
# 计算线性拟合slope, intercept, r_value, p_value, std_err = stats.linregress(x, y)fit_line = slope * x + intercept
# 计算均方误差 (MSE)、根均方误差 (RMSE) 和平均绝对误差 (MAE)mse = np.mean((y - fit_line) ** 2)rmse = np.sqrt(mse)mae = np.mean(np.abs(y - fit_line))
# 绘制带拟合线的散点图plt.figure(figsize=(8, 6))scatter = plt.scatter(x, y,marker='.',c=y, cmap='magma', alpha=1, label='采样点')plt.plot(x, fit_line, color='red', label=f'y={slope:.2f}x+{intercept:.2f}')plt.plot([20, 180], [20, 180], '--', color='grey', label='y=x')
plt.rcParams['font.sans-serif'] = ['STSong']plt.rcParams['axes.unicode_minus'] = False# 计算95%置信区间#confidence_interval = 1.96 * std_err#upper_fit_line = fit_line + confidence_interval#lower_fit_line = fit_line - confidence_interval#plt.plot(x, upper_fit_line, 'k-', alpha=0.6)#plt.plot(x, lower_fit_line, 'k-', alpha=0.6)
# 添加注释plt.xlabel('x')plt.ylabel('y')plt.legend(loc='upper left')plt.text(25, 125, f'$R^2$={r_value**2:.2f}, $P$<0.001\nMAE={mae:.2f}\nRMSE={rmse:.2f}\nMAPE={np.mean(np.abs((y - fit_line) / y)):.2f}', fontsize=12)
plt.xlim(20, 180)plt.ylim(20, 180)plt.show()

import numpy as npimport matplotlib.pyplot as pltfrom scipy import statsimport pandas as pdimport seaborn as sns
# 创建随机数n = 1000x = np.random.uniform(20, 160, n)y = 0.82 * x + 7.68 + np.random.normal(0, 10, n)
# 计算线性拟合slope, intercept, r_value, p_value, std_err = stats.linregress(x, y)fit_line = slope * x + intercept
# 计算均方误差 (MSE)、根均方误差 (RMSE) 和平均绝对误差 (MAE)mse = np.mean((y - fit_line) ** 2)rmse = np.sqrt(mse)mae = np.mean(np.abs(y - fit_line))
# 将数据转换为DataFramedata = pd.DataFrame({'x': x, 'y': y})
# 创建绘图对象g = sns.jointplot(x='x', y='y', data=data, kind='scatter', marginal_kws=dict(bins=40, fill=True))
# 绘制散点图,使用magma colormapg.ax_joint.scatter(x, y, c=y, cmap='magma', alpha=0.7)
# 绘制拟合线g.ax_joint.plot(x, fit_line, color='red', label=f'y={slope:.2f}x+{intercept:.2f}')g.ax_joint.plot([20, 180], [20, 180], '--', color='grey', label='y=x')
# 设置边际图的颜色为黑色for ax in [g.ax_marg_x, g.ax_marg_y]: for patch in ax.patches: patch.set_edgecolor('black') patch.set_facecolor('grey')
# 加粗X轴和Y轴 ax.spines['top'].set_linewidth(1.5) ax.spines['bottom'].set_linewidth(1.5) ax.spines['left'].set_linewidth(1.5) ax.spines['right'].set_linewidth(1.5)
# 设置X轴和Y轴的颜色为黑色 ax.spines['top'].set_color('black') ax.spines['bottom'].set_color('black') ax.spines['left'].set_color('black') ax.spines['right'].set_color('black')
# 添加注释g.ax_joint.set_xlabel('x')g.ax_joint.set_ylabel('y')g.ax_joint.legend(loc='upper left')g.ax_joint.text(25, 125, f'$R^2$={r_value ** 2:.2f}, $P$<0.001\nMAE={mae:.2f}\nRMSE={rmse:.2f}\nMAPE={np.mean(np.abs((y - fit_line) / y)):.2f}', fontsize=12)
# 设置坐标轴范围g.ax_joint.set_xlim(20, 180)g.ax_joint.set_ylim(20, 180)
plt.show()

遥感小屋
分享遥感相关文章、代码,大家一起交流,互帮互助
 最新文章