更改Seaborn中热图的宽度以补偿字体大小的减少

时间:2018-04-18 12:32:56

标签: python-3.x matplotlib seaborn

我有一句话,比如说

Hey I am feeling pretty boring today and the day is dull too

我通过openai情感代码传递给我一些神经元权重,它可以等于或略大于单词数。

神经元重量是

[ 0.01258736,  0.03544582,  0.08490616,  0.09010842,  0.07180552,
        0.07271874,  0.08906463,  0.09690772,  0.10281454,  0.08131664,
        0.08315734,  0.0790544 ,  0.07770097,  0.07302617,  0.07329235,
        0.06856266,  0.07642639,  0.08199468,  0.09079508,  0.09539193,
        0.09061056,  0.07109602,  0.02138061,  0.02364372,  0.00322057,
        0.01517018,  0.01150052,  0.00627739,  0.00445003,  0.00061127,
        0.0228037 , -0.29226044, -0.40493113, -0.4069235 , -0.39796737,
       -0.39871565, -0.39242673, -0.3537892 , -0.3779315 , -0.36448184,
       -0.36063945, -0.3506464 , -0.36719123, -0.37997353, -0.35103855,
       -0.34472692, -0.36256564, -0.35900915, -0.3619383 , -0.3532831 ,
       -0.35352525, -0.33328298, -0.32929575, -0.33149993, -0.32934144,
       -0.3261477 , -0.32421976, -0.3032671 , -0.47205922, -0.46902984,
       -0.45346943, -0.4518705 , -0.50997925, -0.50997925]

现在我要做的是绘制热图,正值显示积极情绪,而负值显示负面情绪,我正在绘制热图,但热图不是应该如此绘图

heatmap

但是当句子变得越来越长时,整个句子越来越小,无法看到,所以我应该做些什么改变才能让它显得更好。

这是我的绘图功能:

def plot_neuron_heatmap(text, values, savename=None, negate=False, cell_height=.112, cell_width=.92):
    #n_limit = 832
    cell_height=.325
    cell_width=.15
    n_limit = count
    num_chars = len(text)
    text = list(map(lambda x: x.replace('\n', '\\n'), text))
    num_chars = len(text)
    total_chars = math.ceil(num_chars/float(n_limit))*n_limit
    mask = np.array([0]*num_chars + [1]*(total_chars-num_chars))
    text = np.array(text+[' ']*(total_chars-num_chars))
    values = np.array((values+[0])*(total_chars-num_chars))

    values = values.reshape(-1, n_limit)
    text = text.reshape(-1, n_limit)
    mask = mask.reshape(-1, n_limit)
    num_rows = len(values)
    plt.figure(figsize=(cell_width*n_limit, cell_height*num_rows))
    hmap=sns.heatmap(values, annot=text, mask=mask, fmt='', vmin=-5, vmax=5, cmap='RdYlGn',xticklabels=False, yticklabels=False, cbar=False)
    plt.subplots_adjust() 
    #plt.tight_layout()
    plt.savefig('fig1.png')
    #plt.show()

这就是它将长文本显示为

的方式

for lengthy text

我希望它展示什么

enter image description here

以下是完整笔记本的链接:https://github.com/yashkumaratri/testrepo/blob/master/heatmap.ipynb

疯狂物理学家,你的代码就是这样做的 enter image description here 它真正应该做的是什么 enter image description here

1 个答案:

答案 0 :(得分:0)

您所看到的字体缩小是预料之中的。当您在水平方向上添加更多字符时,字体会缩小以适应所有内容。有几种解决方案。最简单的方法是将文本分成较小的块,并在显示所需的输出时显示它们。此外,您可以使用不同的DPI打印您的图形与屏幕上显示的内容,以便字母在图像文件中看起来很好。

你应该考虑在整个过程中清理你的功能:

  1. count似乎是一个从未使用过的全局。
  2. 您在不使用原始值的情况下重新定义变量(例如num_chars和输入参数)。
  3. 你有很多你真正使用过的变量。
  4. 您多次重新计算大量数量。
  5. 表达式list(map(lambda x: x.replace('\n', '\\n'), text))完全是过度杀伤:list(text.replace('\n', '\\n'))做同样的事情。
  6. 鉴于大多数情况下len(values) != len(text),行values = np.array((values+[0])*(total_chars-num_chars))是无意义的,需要清理。
  7. 您正在通过对列表执行填充操作来构建numpy数组,而不是使用numpy的强大功能。
  8. 您拥有整个基础架构,可以正确地重新整理阵列,但您不能使用它。
  9. 下面的更新版本修复了次要问题并添加了n_limit作为参数,该参数确定您希望在热图的一行中有多少个字符。正如我在上一篇文章中提到的,你已经拥有了所有必要的代码来正确地重塑你的数组,甚至可以掩盖你最终会得到的额外尾部。唯一错误的是形状中的-1,由于形状的其余部分,它总是解析为一行。此外,图形始终保存在100dpi,因此无论您最终有多少行,结果都应该与给定宽度一致。 DPI会影响PNG,因为它会增加或减少图像中的像素总数,而PNG实际上并不了解DPI:

    def plot_neuron_heatmap(text, values, n_limit=80, savename='fig1.png',
                            cell_height=0.325, cell_width=0.15, dpi=100):
        text = text.replace('\n', '\\n')
        text = np.array(list(text + ' ' * (-len(text) % n_limit)))
        if len(values) > text.size:
            values = np.array(values[:text.size])
        else:
            t = values
            values = np.zeros(text.shape, dtype=np.int)
            values[:len(t)] = t
        text = text.reshape(-1, n_limit)
        values = values.reshape(-1, n_limit)
        # mask = np.zeros(values.shape, dtype=np.bool)
        # mask.ravel()[values.size:] = True
        plt.figure(figsize=(cell_width * n_limit, cell_height * len(text)))
        hmap = sns.heatmap(values, annot=text, fmt='', vmin=-5, vmax=5, cmap='RdYlGn', xticklabels=False, yticklabels=False, cbar=False)
        plt.subplots_adjust()
        plt.savefig(savename if savename else 'fig1.png', dpi=dpi)
    

    以下是该函数的几个示例运行:

    text = 'Hey I am feeling pretty boring today and the day is dull too'
    values = [...] # The stuff in your question
    
    plot_neuron_heatmap(text, values)
    plot_neuron_heatmap(text, values, 20)
    plot_neuron_heatmap(text, values, 7)
    

    得出以下三个数字:

    n_limit=80

    n_limit=20

    n_limit=7