簡體   English   中英

更改Seaborn中熱圖的寬度以補償字體大小的減小

[英]Changing width of heatmap in Seaborn to compensate for font size reduction

我有一句話說

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

瘋狂物理學家,您的代碼執行 在此處輸入圖片說明 它真正應該做的是 在此處輸入圖片說明

您看到的字體縮小是可以預期的。 當您水平添加更多字符時,字體會縮小以適合所有內容。對此有兩種解決方案。 最簡單的方法是將您的文本分成較小的塊,並按您期望的輸出中的顯示方式進行顯示。 另外,您可以使用與屏幕上顯示的DPI不同的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)

結果為以下三個數字:

n_limit = 80

n_limit = 20

n_limit = 7

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM