Python中x与y维度不匹配报错排查及Collatz散点图绘制问题
Collatz序列散点图:解决尺寸不匹配错误与优化可视化
一、搞定“x and y must be the same size”错误
这个报错的本质很简单:传给plt.scatter()的x数组和y数组长度不一样。比如你定义了x是1到1000的所有数,但计算步数的y列表漏了几个数(循环时不小心跳过、函数异常没处理都可能导致)。
典型错误代码示例
假设你的代码是类似这样,就会触发错误:
import matplotlib.pyplot as plt def collatz_steps(n): steps = 0 while n != 1: if n % 2 == 0: n = n // 2 else: n = 3 * n + 1 steps += 1 return steps start_numbers = range(1, 1000) step_counts = [] for num in start_numbers: # 这里跳过了10的倍数,导致step_counts比start_numbers短 if num % 10 == 0: continue step_counts.append(collatz_steps(num)) plt.scatter(start_numbers, step_counts) plt.show()
修正方法
保证每个起始数字都对应一个步数结果,别跳过任何数,同时处理n=1的边界情况(步数为0):
import matplotlib.pyplot as plt def collatz_steps(n): if n == 1: return 0 steps = 0 current = n while current != 1: if current % 2 == 0: current = current // 2 else: current = 3 * current + 1 steps += 1 return steps max_num = 1000 # x是1到max_num的所有数 start_numbers = list(range(1, max_num + 1)) # 每个数都计算步数,y列表长度和x完全一致 step_counts = [collatz_steps(num) for num in start_numbers]
二、优化散点图样式,看清数据模式
默认散点太密,堆在一起根本看不出规律,调整这几个参数就能解决:
s:缩小标记尺寸,比如设成s=3alpha:加透明度,比如alpha=0.6,重叠的点会显示得更深marker:用更紧凑的标记,比如marker='.'(圆点)或marker='x'edgecolors='none':去掉标记边缘的线条,减少视觉干扰
优化后的绘图代码
plt.figure(figsize=(10, 6)) plt.scatter(start_numbers, step_counts, s=3, alpha=0.6, marker='.', edgecolors='none') plt.title('Collatz序列:起始数字 vs 迭代步数') plt.xlabel('起始数字') plt.ylabel('迭代至1的步数') plt.grid(True, linestyle='--', alpha=0.3) plt.show()
进阶玩法:区分奇偶数字
如果想突出奇偶起始数的步数差异,可以给不同类型的点上色:
# 偶数用蓝色,奇数用橙色 colors = ['#1f77b4' if num % 2 == 0 else '#ff7f0e' for num in start_numbers] plt.figure(figsize=(10, 6)) plt.scatter(start_numbers, step_counts, s=3, alpha=0.6, marker='.', edgecolors='none', c=colors) plt.title('Collatz序列:起始数字 vs 迭代步数(奇偶区分)') plt.xlabel('起始数字') plt.ylabel('迭代至1的步数') plt.legend(['偶数', '奇数']) plt.grid(True, linestyle='--', alpha=0.3) plt.show()
内容的提问来源于stack exchange,提问作者sumi
相关产品推荐
相关产品推荐

