pythonic生物人

用它,处理拥挤的散点数据!

在数据分析中,特别是在处理大量散点数据时,2D直方图(2D histogram)能有效避免散点图过于拥挤的问题,帮助我们更好地发现数据之间的潜在关系。

2D直方图(2D histogram),也叫做散点密度图。它通过将数据划分为多个区域,并用不同的颜色表示每个区域内的密度,可以清晰地展示数据的集中区域和稀疏区域。

Python matplotlib使用Axes.hist2d制作2D直方图!


数据准备

这里分享一个matplotlib实现案例,使用“3.2.8 data_2dhist数据集”。

import pandas as pd
data_2dhist = pd.read_csv('matplotlib_data/2dhist.csv')

matplotlib绘图

# 16.1_01
# -*- encoding: utf-8 -*-
'''
未经过允许禁止转载!
@Author  :   公众号: pythonic生物人
@Desc    :   16.1 2D直方图
'''

for i, ax in enumerate(axes.flat):
    x, y = data_2dhist['x'][i * len(data_2dhist) // 6:(i + 1) *
                            len(data_2dhist) //
                            6], data_2dhist['y'][i * len(data_2dhist) //
                                                 6:(i + 1) *
                                                 len(data_2dhist) // 6]
    slope, intercept, corr, bias, rmse = calculate_stats_and_fit(
        x, y)  #calculate_stats_and_fit计算统计信息和拟合趋势线
    hist = ax.hist2d(x, y, bins=100, norm=LogNorm(),
                     cmap="Spectral_r")  # hist2d绘制散点密度图
    ax.plot([-5, 10], [-5, 10],
            color="red",
            linestyle="--",
            linewidth=1.5,
            label="1:1 line")  # 添加y=x参考线

    trend_x = np.linspace(-2, 8, 100)
    trend_y = slope * trend_x + intercept
    ax.plot(trend_x,
            trend_y,
            color="black",
            linestyle="--",
            linewidth=1.5,
            label="Fitted Line")  # 添加拟合趋势线

    stats_text = (f"N = {len(x):,}n"
                  f"Bias = {bias:.2f}n"
                  f"RMSE = {rmse:.2f}n"
                  f"R = {corr:.2f}n"
                  f"Slope = {slope:.2f}")
    ax.text(-4,
            9,
            stats_text,
            fontsize=12,
            verticalalignment="top",
            bbox=dict(facecolor="white", alpha=0.8))  # 添加统计信息

    x_labels = [f"观察值{i+1}" for i in range(6)]  # 设置x轴标题
    ax.set_xlabel(x_labels[i], fontsize=14)
    ax.set_xlim(-5, 10)  # 设置x轴范围

    y_labels = [f"估计值{i+1}" for i in range(6)]  # 设置y轴标题
    ax.set_ylabel(y_labels[i], fontsize=14)
    ax.set_ylim(-5, 10)

    ax.legend(loc="lower right", fontsize=12)  # 设置图例

cbar = fig.colorbar(hist[3], ax=axes, fraction=0.04, pad=0.05)  # 设置colorbar
cbar.set_label("Density", fontsize=14)

plt.show()

Image

-END-

本期内容「绘图数据+代码+代码详细解释」已上传(点击图片直达代码):

👉Python matplotlib保姆级教程
Image

Image

Image

Image

Image

Image

Image

交流学习

Image