【问题标题】:Annotated plot over heatmap with seaborn and matplotlib使用 seaborn 和 matplotlib 对热图进行注释的绘图
【发布时间】:2021-03-14 01:38:59
【问题描述】:

我不能在热图上叠加绘图(热图应该是海底绘制的)。

这是我的小数据示例

mat = [
    [1,2,3,1,1,2,2,1,5],
    [3,2,2,1,1,2,2,1,5],
    [6,2,8,2,1,0,0,4,2],
    [3,1,2,3,1,2,4,1,4],
    [3,1,9,4,1,3,2,1,5],
]

iters = [1, 2, 8, 16, 32, 128, 256, 512, 1024] # iterations for x-axis
names = [1, 2, 3, 4, 5] # 5 clusters 
maxim = [1, 1, 3, 5, 1, 4, 4, 5, 1] # maximum cluster at iter 
conc = ["dog", "spoon", "table", "bike", "hat", "hat", "porch", "sweater", "bird"] # maximum concept in cluster  for annotation

和绘图

def plot_cluster_heatmap_over_iters(iter_scores, iters, cluster_names, maximum_cluster, max_concepts):
    import seaborn as sns
    ax = sns.heatmap(iter_scores, cmap="gist_yarg")
    plt.xticks(range(len(iters)), iters, rotation=90);
    plt.yticks(range(len(cluster_names)), cluster_names, rotation=0);
    ax.set_yticklabels(ax.get_yticks(), size=7)

    
    plt.plot(iters, maximum_cluster, marker='o', )
    #annotate markers
    prev_cl = None
    for it, ci, cl in zip(iters, maximum_cluster, max_concepts):
        if prev_cl is None or prev_cl != cl:    
            plt.annotate(cl, (it, ci), rotation=40, size=12)
            prev_cl = cl
    plt.show()
    
plot_cluster_heatmap_over_iters(mat, iters, names, maxim, conc)

但我有类似的错误

ValueError: Image size of 76240x871 pixels is too large. It must be less than 2^16 in each direction.

有人可以帮助我改进我的代码,使其正常工作并完成工作(我敢打赌几乎没有问题)吗? 谢谢

【问题讨论】:

    标签: python matplotlib seaborn


    【解决方案1】:

    错误的原因是我们在热图上标注的位置信息超出了热图的数据范围。我们创建了一个新的 x 轴值并更改了格式以基于它进行注释。 iters 大于等于 8 的值超出了图形范围。

    import matplotlib.pyplot as plt
    import numpy as np
    
    mat = [
        [1,2,3,1,1,2,2,1,5],
        [3,2,2,1,1,2,2,1,5],
        [6,2,8,2,1,0,0,4,2],
        [3,1,2,3,1,2,4,1,4],
        [3,1,9,4,1,3,2,1,5],
    ]
    
    iters = [1, 2, 8, 16, 32, 128, 256, 512, 1024] # iterations for x-axis
    names = [1, 2, 3, 4, 5] # 5 clusters 
    maxim = [1, 1, 3, 5, 1, 4, 4, 5, 1] # maximum cluster at iter 
    conc = ["dog", "spoon", "table", "bike", "hat", "hat", "porch", "sweater", "bird"] # maximum concept in cluster  for annotation
    maxlen = np.arange(1,10)
    
    def plot_cluster_heatmap_over_iters(iter_scores, iters, cluster_names, maximum_cluster, max_concepts, maxl):
        import seaborn as sns
        ax = sns.heatmap(iter_scores, cmap="gist_yarg")
        plt.xticks(range(len(iters)), iters, rotation=90);
        plt.yticks(range(len(cluster_names)), cluster_names, rotation=0);
        ax.set_yticklabels(ax.get_yticks(), size=7)
    
        
        plt.plot(iters, maximum_cluster, marker='o')
    #     #annotate markers
        prev_cl = None
        for it, ci, cl, ma in zip(iters, maximum_cluster, max_concepts, maxl):
            if prev_cl is None or prev_cl != cl:    
                plt.annotate(cl, (ma, ci), rotation=40, size=12, xycoords='data')
                prev_cl = cl
        plt.show()
        
    plot_cluster_heatmap_over_iters(mat, iters, names, maxim, conc, maxlen)
    

    【讨论】:

    • 我不能接受你的回答,因为桌子、自行车、帽子和鸟没有被情节联系起来,甚至鸟都飞出了图表。这显然不是一张合适的图表。但无论如何,我已经解决了问题
    • 接受与否由您决定。您指出了与问题解决方案不同的挑战,但您的代码不是原因吗?
    【解决方案2】:

    这是我的解决方案。关键是使用range(len(iters))进行注释和绘图,而不是iters

    #test
    mat = [
        [1,2,3,1,1,2,2,1,5],
        [3,2,2,1,1,2,2,1,5],
        [6,2,8,2,1,0,0,4,2],
        [3,1,2,3,1,2,4,1,4],
        [3,1,9,4,1,3,2,1,5],
    ]
    
    iters = [1, 2, 8, 16, 32, 128, 256, 512, 1024] # iterations for x-axis
    names = [1, 2, 3, 4, 5] # 5 clusters 
    maxim = [1, 1, 3, 5, 1, 4, 4, 5, 1] # maximum cluster at iter 
    conc = ["dog", "spoon", "table", "bike", "hat", "hat", "porch", "sweater", "bird"] # maximum concept in cluster  for annotation
    
    def plot_cluster_heatmap_over_iters(iter_scores, iters, cluster_names, maximum_cluster, max_concepts):
        import seaborn as sns
        ax = sns.heatmap(iter_scores, cmap="gist_yarg")
        plt.xticks(range(len(iters)), iters, rotation=90);
        plt.yticks(range(len(cluster_names)), cluster_names, rotation=0);
        ax.set_yticklabels(ax.get_yticks(), size=7)
    
        plt.plot(range(len(iters)), maximum_cluster, marker='o')
        #annotate markers
        prev_cl = None
        for it, ci, cl in zip(range(len(iters)), maximum_cluster, max_concepts):
            if prev_cl is None or prev_cl != cl:    
                plt.annotate(cl, (it, ci), rotation=40, size=12, xycoords='data')
                prev_cl = cl
        plt.show()
        
    plot_cluster_heatmap_over_iters(mat, iters, names, maxim, conc)
    

    【讨论】:

      猜你喜欢
      • 2018-11-23
      • 2019-10-21
      • 1970-01-01
      • 2020-04-19
      • 2016-01-14
      • 2020-09-04
      • 2020-01-14
      相关资源
      最近更新 更多