亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

向熱圖中的特定單元格添加注釋

向熱圖中的特定單元格添加注釋

墨色風雨 2022-08-25 14:37:03
我正在繪制一個海生的熱圖,并希望僅使用自定義文本注釋特定單元格。import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsfrom io import StringIOdata = StringIO(u'''75,83,41,47,19                    51,24,100,0,58                    12,94,63,91,7                    34,13,86,41,77''')labels = StringIO(u'''7,8,4,,1                    5,2,,2,8                    1,,6,,7                    3,1,,4,7''')data = pd.read_csv(data, header=None)data = data.apply(pd.to_numeric)labels = pd.read_csv(labels, header=None)#labels = np.ma.masked_invalid(labels)fig, ax = plt.subplots()sns.heatmap(data, annot=labels, ax=ax, vmin=0, vmax=100)plt.show()上面的代碼生成以下熱圖:注釋行將生成以下熱圖:我想在單元格上僅顯示非nan(或非零)文本。如何做到這一點?
查看完整描述

3 回答

?
GCT1015

TA貢獻1827條經驗 獲得超4個贊

使用字符串數組而不是掩碼數組:annot


import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

import seaborn as sns

from io import StringIO


data = StringIO(u'''75,83,41,47,19

                    51,24,100,0,58

                    12,94,63,91,7

                    34,13,86,41,77''')


labels = StringIO(u'''7,8,4,,1

                    5,2,,2,8

                    1,,6,,7

                    3,1,,4,7''')


data = pd.read_csv(data, header=None)

data = data.apply(pd.to_numeric)


labels = pd.read_csv(labels, header=None)

#labels = np.ma.masked_invalid(labels)


# Convert everything to strings:

annotations = labels.astype(str)

annotations[np.isnan(labels)] = ""


fig, ax = plt.subplots()

sns.heatmap(data, annot=annotations, fmt="s", ax=ax, vmin=0, vmax=100)

plt.show()

查看完整回答
反對 回復 2022-08-25
?
藍山帝景

TA貢獻1843條經驗 獲得超7個贊

要通過@mrzo來補充答案,您可以使用 in 將 s 存儲為空字符串,并用于轉換為就地字符串:na_filter=Falseread_csv()nanpandas.DataFrame.astype()


# ...

labels = pd.read_csv(labels, header=None, na_filter=False).astype(str)

sns.heatmap(data, annot=labels, fmt='s', ax=ax, vmin=0, vmax=100)


查看完整回答
反對 回復 2022-08-25
?
蕪湖不蕪

TA貢獻1796條經驗 獲得超7個贊

只是要添加這個,因為我花了一些時間來弄清楚如何以編程方式為稍微不同的應用程序做類似的事情:我想從注釋中抑制0值,但是由于這些值是交叉表操作的結果而產生的,因此我無法使用William Miller的好方法,除非將交叉表寫出來,然后讀回它似乎...不雅。


可能有一種更優雅的方法來做到這一點,但對我來說,運行它的速度快得離譜,而且非常簡單。numpy


import numpy as np

import pandas as pd

import seaborn as sns


from io import StringIO


data = StringIO(u'''75,83,41,47,19

                    51,24,100,0,58

                    12,94,63,91,7

                    34,13,86,41,77''')


data = pd.read_csv(data, header=None)

data = data.apply(pd.to_numeric)


# For more complex functions you could write a def instead

# of using this simple lambda function

an = np.vectorize(lambda x: '' if x<50 else str(round(x,-1)))(data.to_numpy())


sns.heatmap(

    data=data.to_numpy(), # Note this is now numpy too

    cmap='BuPu',

    annot=an,   # The matching ndarray of annotations

    fmt = '',   # Formats annotations as strings (i.e. no formatting)

    cbar=False, # Seems overkill if you've got annotations

    vmin=0, 

    vmax=data.max().max()

)

在標記軸方面,這可能會使生活變得更加困難,盡管它非常簡單:.如果你在第一列中有軸標簽,那么你需要在調用中使用(),但與自定義色彩映射表(例如0==white)相結合,你可以創建更容易查看的熱圖。ax.set_xticklabels(df.columns.values)ilocdata.iloc[:,1:]to_numpy


顯然,粗略的舍入令人困惑(為什么80有不同的色調?),但你明白了:


查看完整回答
反對 回復 2022-08-25
  • 3 回答
  • 0 關注
  • 164 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號