如何自定义Seaborn/Matplotlib实现希伯来语字母矩阵的RTL布局及色彩定制
你提出的两个定制需求都可以通过Seaborn和Matplotlib实现,具体实现方案如下:
需求1:实现希伯来语从右到左(RTL)的矩阵排列
只需要对reshape后的字符矩阵、背景色数值矩阵使用numpy的水平翻转方法np.fliplr()处理即可,翻转后原本从左到右排列的列会反转顺序,实现右上角起始、从右往左阅读的希伯来语排版要求。
需求2:自定义单元格背景色和文本颜色
- 背景色自定义:你可以自行构建和字符矩阵尺寸完全一致的数值矩阵,每个位置的数值对应你预设的色阶映射规则,也可以直接自定义颜色映射表(cmap)实现任意单元格背景色配置,不需要使用示例里的随机数值。
- 文本颜色自定义:热图生成后可以遍历所有标注文本对象,根据你的业务规则(比如命中等距字母序列的字符标红)单独修改每个位置的文本颜色。
以下是修改后的完整可运行代码示例:
import numpy as np import matplotlib.pyplot as plt import seaborn as sns figure = plt.figure(figsize=(10, 6)) axes = figure.add_subplot(111) # 希伯来语字母序列 L = ['ב', 'ר', 'א', 'ש', 'י', 'ת', 'ב', 'ר', 'א', 'א', 'ל', 'ה', 'י', 'ם', 'א', 'ת', 'ה', 'ש', 'מ', 'י', 'ם', 'ו', 'א', 'ת', 'ה', 'א', 'ר', 'ץ', 'ו', 'ה', 'א', 'ר', 'ץ', 'ה', 'י', 'ת', 'ה', 'ת', 'ה', 'ו', 'ו', 'ב', 'ה', 'ו', 'ו', 'ח', 'ש', 'ך', 'ע', 'ל', 'פ', 'נ', 'י', 'ת', 'ה', 'ו', 'ם', 'ו', 'ר', 'ו', 'ח', 'א', 'ל', 'ה', 'י', 'ם', 'מ', 'ר', 'ח', 'פ', 'ת', 'ע', 'ל', 'פ', 'נ', 'י', 'ה', 'מ', 'י', 'ם', 'ו', 'י', 'א', 'מ', 'ר', 'א', 'ל', 'ה', 'י', 'ם', 'י', 'ה', 'י', 'א', 'ו', 'ר', 'ו', 'י', 'ה', 'י', 'א', 'ו', 'ר', 'ו', 'י', 'ר', 'א', 'א', 'ל', 'ה', 'י', 'ם', 'א', 'ת', 'ה', 'א', 'ו', 'ר', 'כ', 'י', 'ט', 'ו', 'ב', 'ו', 'י', 'ב', 'ד', 'ל', 'א', 'ל', 'ה', 'י', 'ם', 'ב', 'י', 'ן', 'ה', 'א', 'ו', 'ר', 'ו', 'ב', 'י', 'ן', 'ה', 'ח', 'ש', 'ך', 'ו', 'י', 'ק', 'ר', 'א', 'א', 'ל', 'ה', 'י', 'ם', 'ל', 'א', 'ו', 'ר', 'י', 'ו', 'ם', 'ו', 'ל', 'ח', 'ש', 'ך', 'ק', 'ר', 'א', 'ל', 'י', 'ל', 'ה', 'ו', 'י', 'ה', 'י', 'ע', 'ר', 'ב', 'ו', 'י', 'ה', 'י', 'ב', 'ק', 'ר', 'י', 'ו', 'ם', 'א', 'ח', 'ד', 'ו', 'י', 'א'] SequenceForMatrix = L[0:200] row_num = 10 col_num = len(SequenceForMatrix) // row_num # 1. 构造背景色数值矩阵(可根据你的需求自定义每个位置的数值,对应不同背景色) # 这里示例:默认所有单元格数值为0(浅背景),你可以自行修改特定位置的数值 bg_data = np.zeros((row_num, col_num)) # 示例:把第2行第5列的单元格背景设为深色 bg_data[1][4] = 2 # 2. 构造字符矩阵 char_matrix = np.array(SequenceForMatrix).reshape(row_num, col_num) # 3. 水平翻转矩阵实现RTL排版 bg_data_rtl = np.fliplr(bg_data) char_matrix_rtl = np.fliplr(char_matrix) # 生成热图 sns.heatmap(data=bg_data_rtl, annot=char_matrix_rtl, fmt='', xticklabels=[], yticklabels=[], cmap='Blues', vmin=0, vmax=2, square=True, ax=axes, cbar=False) # 4. 自定义文本颜色 示例:把第2行第5列的文本设为红色 for text in axes.texts: # 获取文本所在的行列位置 x, y = text.get_position() row = int(y - 0.5) col = int(x - 0.5) # 自定义规则:比如命中ELS序列的位置修改颜色 if row == 1 and col == (col_num - 5): # 因为翻转了列所以要转换位置 text.set_color('red') text.set_weight('bold') plt.show()
内容的提问来源于stack exchange,提问作者TorahBibleCodes
相关产品推荐
相关产品推荐

