如何为每个X值添加双倍Y值?城镇人口绘图年份异常问题求助
问题解决:Matplotlib年份显示异常及数据匹配修正
核心问题分析
原代码的问题在于X轴数据与Y轴数据长度不匹配,且年份用0.5间隔生成,导致视觉上年份数量翻倍:
- 每个年份生成2个Y值(真实人口+虚拟人口),但X轴仅生成
amount_years个年份值(间隔0.5),两者长度不一致; - 0.5间隔的年份显示让输入10年时看起来像20个年份。
修改后的完整代码
from matplotlib import __version__ print('matplotlib version : ', __version__) import matplotlib.pyplot as plt import numpy as np import random def main(): P = 14613 K = 26760 e = np.exp(1) R = 0.083 T = 0 current_year = 2006 font1 = {'family':'serif','color':'blue','size':20} font2 = {'family':'serif','color':'darkred','size':15} population = [] years = [] amount_years = int(input("How many years since 2006 do you want to calculate the population: ")) for _ in range(amount_years): noise = random.uniform(-0.03, 0.03) # 计算真实人口 real_pop = (P*K*(e**(R*T)))/((K-P)+P*(e**(R*T))) # 计算带噪声的虚拟人口 dummy_pop = real_pop * (1 + noise) # 每个年份对应两个X值(保证与Y值长度匹配) years.append(current_year) years.append(current_year) # 添加对应的人口数据 population.append(real_pop) population.append(dummy_pop) # 更新时间参数与年份 T += 1 current_year += 1 xpoints = years ypoints = population plt.title("Portlaoise population since 2006", fontdict=font1, loc='left') plt.xlabel("Years since 2006", fontdict=font2) plt.ylabel("Population of Portlaoise", fontdict=font2) # 强制X轴显示整数年份,避免小数间隔 plt.xticks(range(2006, 2006 + amount_years)) plt.plot(xpoints, ypoints) plt.show() main()
关键修改点
- 数据长度匹配:每个年份循环中,将当前年份添加两次到
years列表,确保X轴数据长度与Y轴(2*amount_years)完全一致。 - 优化X轴显示:用
plt.xticks()强制显示输入范围内的整数年份,消除0.5间隔的视觉混淆。 - 代码可读性优化:重命名变量(如
dummy_pop替代原x),简化噪声计算逻辑,让代码更易维护。
可选增强:断开跨年份连线
如果希望仅显示每个年份内部的波动连线,不连接不同年份的点,可在循环末尾添加NaN值断开连线:
for _ in range(amount_years): # ... 原有计算代码 ... years.append(current_year) years.append(current_year) population.append(real_pop) population.append(dummy_pop) # 添加NaN断开连线 years.append(np.nan) population.append(np.nan) # ... 更新参数代码 ...
内容的提问来源于stack exchange,提问作者rorycostigan
相关产品推荐
相关产品推荐

