【问题标题】:Plotting two heat maps side by side in Matplotlib在 Matplotlib 中并排绘制两个热图
【发布时间】:2019-09-03 21:24:21
【问题描述】:

我有一个函数可以绘制 DataFrame 的相关矩阵的热图。函数如下所示:

def corr_heatmap(data):
    columns = data.columns
    corr_matrix = data.corr()

    fig, ax = plt.subplots(figsize=(7, 7))
    mat = ax.matshow(corr_matrix, cmap='coolwarm')

    ax.set_xticks(range(len(columns)))
    ax.set_yticks(range(len(columns)))
    ax.set_xticklabels(columns)
    ax.set_yticklabels(columns)
    plt.setp(ax.get_xticklabels(), rotation=45, ha='left', rotation_mode='anchor')
    plt.colorbar(mat, fraction=0.045, pad=0.05)
    fig.tight_layout()
    plt.show()

    return mat

当使用 DataFrame 运行时,会输出如下内容:

我想做的是并排绘制其中两个热图,但我在这样做时遇到了一些麻烦。到目前为止,我所做的是尝试将每个热图分配给 AxesImage 对象并使用子图来绘制它们。

mat1 = corr_heatmap(corr_mat1)
mat2 = corr_heatmap(corr_mat2)

fig = plt.figure(figsize=(15, 15))
ax1 = fig.add_subplot(221)
ax2 = fig.add_subplot(222)
ax1.plot(ma1)
ax2.plot(ma2)

但这给了我以下错误:

TypeError: float() argument must be a string or a number, not 'AxesImage'

有没有人知道我可以并排绘制两个热图图像的方法?谢谢。

编辑

如果有人想知道我想做的最终代码是什么样的:

def corr_heatmaps(data1, data2, method='pearson'):

    # Basic Configuration
    fig, axes = plt.subplots(ncols=2, figsize=(12, 12))
    ax1, ax2 = axes
    corr_matrix1 = data1.corr(method=method)
    corr_matrix2 = data2.corr(method=method)
    columns1 = corr_matrix1.columns
    columns2 = corr_matrix2.columns

    # Heat maps.
    im1 = ax1.matshow(corr_matrix1, cmap='coolwarm')
    im2 = ax2.matshow(corr_matrix2, cmap='coolwarm')

    # Formatting for heat map 1.
    ax1.set_xticks(range(len(columns1)))
    ax1.set_yticks(range(len(columns1)))
    ax1.set_xticklabels(columns1)
    ax1.set_yticklabels(columns1)
    ax1.set_title(data1.name, y=-0.1)
    plt.setp(ax1.get_xticklabels(), rotation=45, ha='left', rotation_mode='anchor')
    plt.colorbar(im1, fraction=0.045, pad=0.05, ax=ax1)

    # Formatting for heat map 2.
    ax2.set_xticks(range(len(columns2)))
    ax2.set_yticks(range(len(columns2)))
    ax2.set_xticklabels(columns2)
    ax2.set_yticklabels(columns2)
    ax2.set_title(data2.name, y=-0.1)
    plt.setp(ax2.get_xticklabels(), rotation=45, ha='left', rotation_mode='anchor')
    plt.colorbar(im2, fraction=0.045, pad=0.05, ax=ax2)

    fig.tight_layout()

这可以(当使用两个 Pandas DataFrames 运行时)输出如下图所示的内容:

【问题讨论】:

    标签: python matplotlib subplot


    【解决方案1】:

    请按照下面的示例,将绘图更改为 matshow,根据您的需要进行轴自定义。

    import numpy as np 
    import matplotlib.pyplot as plt 
    
    def f(t): 
        return np.exp(-t) * np.cos(2*np.pi*t) 
    
    t1 = np.arange(0.0, 3.0, 0.01) 
    
    ax1 = plt.subplot(121) 
    ax1.plot(t1, f(t1), 'k') 
    
    ax2 = plt.subplot(122) 
    ax2.plot(t1, f(t1), 'r') 
    plt.show() 
    

    输出:

    【讨论】:

    • 感谢兰吉特的回答。不幸的是,这不是我想要完成的。我已经熟悉如何使用 Matplotlib 制作简单的子图。我发布这个问题的原因是因为我想利用我制作的自定义函数来并排输出两个热图。
    【解决方案2】:

    您需要的是plt.subplots 函数。您可以初始化一个Figure 和一些Axes,而不是手动将Axes 对象添加到Figure。然后,就像在每个Axes 上调用matshow 一样简单:

    import numpy as np
    import pandas as pd
    
    from matplotlib import pyplot as plt
    
    df = pd.DataFrame(np.random.rand(10, 10))
    
    fig, axes = plt.subplots(ncols=2, figsize=(8, 4))
    
    ax1, ax2 = axes
    
    im1 = ax1.matshow(df.corr())
    im2 = ax2.matshow(df.corr())
    
    fig.colorbar(im1, ax=ax1)
    fig.colorbar(im2, ax=ax2)
    

    您可以稍后执行所有其他格式设置。

    【讨论】:

    • 嗨@gmds,你知道我怎样才能为两个热图使用相同的颜色条吗?
    • @NimrodMorag 你应该问一个新问题。
    • 你好,在哪里添加注释选项?
    猜你喜欢
    • 2018-11-29
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 1970-01-01
    • 2020-05-30
    • 2020-03-31
    • 2017-06-07
    • 2016-01-21
    相关资源
    最近更新 更多