Matplotlib如何调整散点图尺寸并添加线性回归线
问题根因
- 画布尺寸调整失效、数据显示不全:
plt.figure(figsize=(10,10))被写在遍历数据点的for循环内部,每遍历一个点就新建一张独立画布,单张画布仅绘制1个散点,循环结束后最终展示的是最后一张仅含单个点的画布,无法看到全部数据。 - 回归线报错:提取坐标时写了
np.array[:,0],np.array是numpy的内置构造函数,不是存储数据的变量,对函数对象做切片就会触发TypeError: 'builtin_function_or_method' object is not subscriptable报错,正确的数据源是提前定义的data数组。
修正后可直接运行的代码
import matplotlib.pyplot as plt import numpy as np plt.close('all') data = np.array([ [22.8, 13.2], [19.6, 4.9], [0.3, -16.5], [8.9, 3.9], [13.7, 9.5], [14.7, -0.4], [1.9, 4.8], [-1.8, -11.4], [-3, -4.6], [-5.9, 2.2], [-13.4, -6.3], [-5.7, -1.7], [-6.8, 5], ]) custom_annotations = ["K464E", "K472E", "R470E", "K464A", "M155E", "K472A", "M155A", "Q539A", "M155R", "D244A", "E247A", "E247R", "D244K"] class_colours = ["r", "r", "r", "r", "r", "r", "g", "g", "b", "b", "b", "b", "b"] # 画布初始化移到循环外,仅创建一次,第二个参数为高度,可按需调整数值 plt.figure(figsize=(10, 12)) for i, point in enumerate(data): plt.scatter(point[0], point[1], marker='o', label=custom_annotations[i], c=class_colours[i], edgecolors='black', linewidths=1, alpha=0.75) plt.annotate(custom_annotations[i], (data[i,0], data[i,1])) # 绘制线性回归线 x = data[:, 0] y = data[:, 1] m, b = np.polyfit(x, y, 1) # 生成x轴范围内的连续点,避免乱序原始数据导致拟合线呈折线 x_fit = np.linspace(x.min(), x.max(), 100) plt.plot(x_fit, m*x_fit + b, color='#333333', linestyle='-', linewidth=1.5, label='线性回归线') plt.xlabel(r'$\Delta q$', fontsize=12) plt.ylabel(r'$\Delta V_{0.5}$ Apo wild-type mHCN2 (mV)', fontsize=12) plt.axvline(0, c=(.5, .5, .5), ls= '--') plt.axhline(0, c=(.5, .5, .5), ls= '--') plt.legend(ncol=3, loc=(1.04, 0)) # 自动调整布局,避免外置图例被截断 plt.tight_layout() plt.show()
注意事项
- 画布尺寸通过
figsize=(宽度, 高度)控制,如需进一步增大高度,直接修改第二个参数的数值即可。 - 回归线样式可通过修改
plt.plot中的color(颜色)、linestyle(线型)、linewidth(线宽)参数自定义。 - 原有散点配色、样本点注释、LaTeX格式坐标轴标注、中心十字参考线、外置多列图例均完整保留,未做改动。
内容的提问来源于stack exchange,提问作者sphero
相关产品推荐
相关产品推荐

