【问题标题】:Changing width of heatmap in Seaborn to compensate for font size reduction在 Seaborn 中更改热图的宽度以补偿字体大小的减小
【发布时间】:2018-04-18 12:32:56
【问题描述】:

我有一个像say这样的句子

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]

现在我想做的是绘制热图,正值显示积极情绪,而负值显示消极情绪,我正在绘制热图,但热图并没有像应有的那样绘制

但是当句子变长整个句子变得越来越小看不到,那么我应该做些什么改变才能让它更好地显示出来。

这是我的绘图功能:

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()

这就是它如何将冗长的文本显示为

我希望它显示什么

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

疯狂的物理学家,你的代码就是这样做的 它真正应该做的是

【问题讨论】:

  • 如果只有12行,就贴在这里。不要指望人们会离开现场来帮助您。
  • 显示一个较长句子的示例,并显示您希望它看起来像什么。此处的示例似乎完全没有问题,并且很难通过提供的信息了解您想要的内容。例如,您要插入换行符吗?您希望能够滚动浏览更长的句子吗?
  • imgur.com/a/8I57H 这就是它的作用
  • 我在@MadPhysicist 评论上运行了模型,但字体太小了,Is 甚至没有断线。
  • 我相信我可以。感谢您的响应。

标签: python-3.x matplotlib seaborn


【解决方案1】:

您看到的字体会缩小是意料之中的。当您水平添加更多字符时,字体会缩小以适应所有内容。对此有几种解决方案。最简单的方法是将您的文本分成更小的块,并按照您在所需输出中显示的方式显示它们。此外,您可以使用与屏幕上显示的内容不同的 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. 您已经拥有用于正确重塑阵列的整个基础架构,但您没有使用它。

下面的更新版本修复了一些小问题,并添加了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)

结果如下三图:

【讨论】:

猜你喜欢
  • 2017-10-31
  • 2015-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-19
  • 1970-01-01
  • 1970-01-01
  • 2016-09-11
相关资源
最近更新 更多