Seaborn 热图:单元格中的下划线文本
Seaborn Heatmap: underline text in a cell
我正在Python中做一些数据分析,我正在使用Seaborn进行可视化。
Seaborn 非常适合创建热图。
我试图在我的热图中强调每列的最大值。
通过将最大单元格设置为 斜体 和 粗体,我能够正确突出显示它们中的文本。尽管如此,我还是找不到下划线的方法。
这是我的代码示例:
data_matrix = < extract my data and put them into a matrix >
max_in_each_column = np.max(data_matrix, axis=0)
sns.heatmap(data_matrix,
mask=data_matrix == max_in_each_column,
linewidth=0.5,
annot=True,
xticklabels=my_x_tick_labels,
yticklabels=my_y_tick_labels,
cmap="coolwarm_r")
sns.heatmap(data_matrix,
mask=data_matrix != max_in_each_column,
annot_kws={"style": "italic", "weight": "bold"},
linewidth=0.5,
annot=True,
xticklabels=my_x_tick_labels,
yticklabels=my_y_tick_labels,
cbar=False,
cmap="coolwarm_r")
这是我目前的结果:
当然我尝试过使用参数annot_kws={"style": "underlined"}
,但显然在 Seaborn 中 "style" 键只支持值 "normal"、"italic" 或 "oblique"。
有解决办法吗?
是的,您可以在文本中使用 tex 命令来解决您的问题。基本思想是使用 seaborn.heatmap
的 annot
键将字符串数组分配为文本标签。这些包含您的数据值 + 一些 tex prefixes/suffixes 以允许 tex 使它们成为 bold/emphasized(斜体)/带下划线或其他任何内容。
一个例子(随机数):
# random data
data_matrix = np.round(np.random.rand(10, 10), decimals=2)
max_in_each_column = np.max(data_matrix, axis=0)
# Activating tex in all labels globally
plt.rc('text', usetex=True)
# Adjust font specs as desired (here: closest similarity to seaborn standard)
plt.rc('font', **{'size': 14.0})
plt.rc('text.latex', preamble=r'\usepackage{lmodern}')
# remains unchanged
sns.heatmap(data_matrix,
mask=data_matrix == max_in_each_column,
linewidth=0.5,
annot=True,
cmap="coolwarm_r")
# changes here
sns.heatmap(data_matrix,
mask=data_matrix != max_in_each_column,
linewidth=0.5,
# Use annot key with np.array as value containing strings of data + latex
# prefixes/suffices making the bold/italic/underline formatting
annot=np.array([r'\textbf{\emph{\underline{' + str(data) + '}}}'
for data in data_matrix.ravel()]).reshape(
np.shape(data_matrix)),
# fmt key must be empty, formatting error otherwise
fmt='',
cbar=False,
cmap="coolwarm_r")
plt.show()
进一步解释注释数组:
# For all matrix_elements in your 2D data array (2D requires the .ravel() and .reshape()
# stuff at the end) construct in sum a 2D data array consisting of strings
# \textbf{\emph{\underline{<matrix_element>}}}. Each string will be represented by tex as
# a bold, italic and underlined representation of the matrix_element
np.array([r'\textbf{\emph{\underline{' + str(data) + '}}}'
for data in data_matrix.ravel()]).reshape(np.shape(data_matrix))
结果图基本上就是你想要的:
我正在Python中做一些数据分析,我正在使用Seaborn进行可视化。 Seaborn 非常适合创建热图。
我试图在我的热图中强调每列的最大值。
通过将最大单元格设置为 斜体 和 粗体,我能够正确突出显示它们中的文本。尽管如此,我还是找不到下划线的方法。
这是我的代码示例:
data_matrix = < extract my data and put them into a matrix >
max_in_each_column = np.max(data_matrix, axis=0)
sns.heatmap(data_matrix,
mask=data_matrix == max_in_each_column,
linewidth=0.5,
annot=True,
xticklabels=my_x_tick_labels,
yticklabels=my_y_tick_labels,
cmap="coolwarm_r")
sns.heatmap(data_matrix,
mask=data_matrix != max_in_each_column,
annot_kws={"style": "italic", "weight": "bold"},
linewidth=0.5,
annot=True,
xticklabels=my_x_tick_labels,
yticklabels=my_y_tick_labels,
cbar=False,
cmap="coolwarm_r")
这是我目前的结果:
当然我尝试过使用参数annot_kws={"style": "underlined"}
,但显然在 Seaborn 中 "style" 键只支持值 "normal"、"italic" 或 "oblique"。
有解决办法吗?
是的,您可以在文本中使用 tex 命令来解决您的问题。基本思想是使用 seaborn.heatmap
的 annot
键将字符串数组分配为文本标签。这些包含您的数据值 + 一些 tex prefixes/suffixes 以允许 tex 使它们成为 bold/emphasized(斜体)/带下划线或其他任何内容。
一个例子(随机数):
# random data
data_matrix = np.round(np.random.rand(10, 10), decimals=2)
max_in_each_column = np.max(data_matrix, axis=0)
# Activating tex in all labels globally
plt.rc('text', usetex=True)
# Adjust font specs as desired (here: closest similarity to seaborn standard)
plt.rc('font', **{'size': 14.0})
plt.rc('text.latex', preamble=r'\usepackage{lmodern}')
# remains unchanged
sns.heatmap(data_matrix,
mask=data_matrix == max_in_each_column,
linewidth=0.5,
annot=True,
cmap="coolwarm_r")
# changes here
sns.heatmap(data_matrix,
mask=data_matrix != max_in_each_column,
linewidth=0.5,
# Use annot key with np.array as value containing strings of data + latex
# prefixes/suffices making the bold/italic/underline formatting
annot=np.array([r'\textbf{\emph{\underline{' + str(data) + '}}}'
for data in data_matrix.ravel()]).reshape(
np.shape(data_matrix)),
# fmt key must be empty, formatting error otherwise
fmt='',
cbar=False,
cmap="coolwarm_r")
plt.show()
进一步解释注释数组:
# For all matrix_elements in your 2D data array (2D requires the .ravel() and .reshape()
# stuff at the end) construct in sum a 2D data array consisting of strings
# \textbf{\emph{\underline{<matrix_element>}}}. Each string will be represented by tex as
# a bold, italic and underlined representation of the matrix_element
np.array([r'\textbf{\emph{\underline{' + str(data) + '}}}'
for data in data_matrix.ravel()]).reshape(np.shape(data_matrix))
结果图基本上就是你想要的: