如何为矩阵图添加预定义素数列表作为坐标轴标签?
修正矩阵图坐标轴素数标签的方案
你的代码问题在于仅设置了标签文本,但未指定标签对应的坐标轴刻度位置,且matshow默认的刻度数量远小于200,导致标签错位。以下是修正后的完整代码及关键说明:
关键修正点
- 确保生成准确的前200个奇素数列表
- 手动指定刻度位置与对应素数标签,按需控制显示密度
- 优化标签显示样式避免重叠
修正后的代码
import numpy as np import matplotlib.pyplot as plt from sympy import sieve, prime matrix_size = 200 matrix = np.zeros((matrix_size, matrix_size)) with open('C:/Users/esultano/git/elliptic_curves/data/elliptic_curves.csv') as f: for line in f.readlines(): line = line.strip() p, q, cases = eval(line) idx_p = sieve.search(p)[0]-2 idx_q = sieve.search(q)[0]-2 if idx_p < matrix_size and idx_q < matrix_size: cases_set = set(case[0] for case in cases) val = sum(i*i for i in cases_set) matrix[idx_p, idx_q] = val matrix[idx_q, idx_p] = val # 生成前200个奇素数(3到1229) # sieve索引从1开始:sieve[1]=2,sieve[2]=3,sieve[202]=1229(第200个奇素数) axis_labels = [sieve[i] for i in range(2, 202)] fig = plt.figure(figsize=(12, 12)) ax = fig.add_subplot(111) matrix_plot = ax.matshow(matrix, interpolation='nearest') # 设置刻度:每隔20个位置显示一个标签(可根据需求调整间隔) tick_interval = 20 # 生成要显示的刻度位置(索引)和对应的素数标签 tick_positions = np.arange(0, matrix_size, tick_interval) tick_labels = [axis_labels[pos] for pos in tick_positions] # 应用刻度和标签 ax.set_xticks(tick_positions) ax.set_xticklabels(tick_labels) ax.set_yticks(tick_positions) ax.set_yticklabels(tick_labels) # 优化x轴标签显示,避免重叠 plt.xticks(rotation=45, ha='right', fontsize=10) plt.yticks(fontsize=10) # 添加颜色条(可选,增强可读性) plt.colorbar(matrix_plot) plt.show()
代码说明
- 素数列表生成:直接通过
sieve索引获取前200个奇素数,避免primerange可能出现的边界误差 - 刻度控制:通过
tick_interval调整显示的标签数量,比如设为20则显示10个标签(0、20、40...180位置),对应素数3、73、173...1193 - 标签样式优化:旋转x轴标签并调整对齐方式,防止标签重叠;设置字体大小提升可读性
- 对称性保持:原代码中矩阵的对称性处理正确,无需修改
内容的提问来源于stack exchange,提问作者Eldar Sultanow
相关产品推荐
相关产品推荐

