You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为矩阵图添加预定义素数列表作为坐标轴标签?

修正矩阵图坐标轴素数标签的方案

你的代码问题在于仅设置了标签文本,但未指定标签对应的坐标轴刻度位置,且matshow默认的刻度数量远小于200,导致标签错位。以下是修正后的完整代码及关键说明:

关键修正点

  1. 确保生成准确的前200个奇素数列表
  2. 手动指定刻度位置与对应素数标签,按需控制显示密度
  3. 优化标签显示样式避免重叠

修正后的代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 01:01:16