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

如何为每个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()

关键修改点

  1. 数据长度匹配:每个年份循环中,将当前年份添加两次到years列表,确保X轴数据长度与Y轴(2*amount_years)完全一致。
  2. 优化X轴显示:用plt.xticks()强制显示输入范围内的整数年份,消除0.5间隔的视觉混淆。
  3. 代码可读性优化:重命名变量(如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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 09:40:54