[英]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打印圖形,以使字母在圖像文件中看起來很好。
您應該考慮一路清理功能:
count
似乎是一個從未使用過的全局變量。 num_chars
和輸入參數)。 list(map(lambda x: x.replace('\\n', '\\\\n'), text))
完全過大了: list(text.replace('\\n', '\\\\n'))
做同樣的事情。 len(values) != len(text)
在大多數情況下,行values = np.array((values+[0])*(total_chars-num_chars))
是無意義的,需要清除。 下面的更新版本解決了一些小問題,並添加了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)
結果為以下三個數字:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.