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

基于输入数据百分位数设置直方图坐标轴范围

基于百分位数设置直方图坐标轴范围以限制异常值

我希望根据输入数据的百分位数为模拟数据设置最小和最大范围,以限制直方图中的异常值。目前已有一个能正常生成图表的函数,但不知道如何为单个直方图设置坐标轴范围。我已经了解如何用NumPy计算数据的百分位数,函数代码如下:

def plotResults(spotData, loadData,\
                    loadTitle = 'Load Simulation Histogram', loadXLabel = 'Simulated Total GWh', loadYLabel = 'freqency'\
                        ,spotTitle = 'Spot Simulation Histogram', spotXLabel = 'Simulated Mean ($/MWh)', spotYLabel = 'freqency'\
                         ,minPerctile = 1, maxPercentile = 99):
  

        fig, axs = plt.subplots(1,2,figsize=(12,6))
        axs[0].hist(loadData/2000, bins = 50)
        axs[0].set_title(loadTitle)
        axs[0].xaxis.set_label_text(loadXLabel)
        axs[0].yaxis.set_label_text(loadYLabel)
        
        axs[1].hist(spotData, bins = 50)
        axs[1].set_title(spotTitle)
        axs[1].xaxis.set_label_text(spotXLabel)
        axs[1].yaxis.set_label_text(spotYLabel)

        plt.show()

修改后的函数实现

只需在绘制直方图后,用NumPy计算目标百分位数,再调用ax.set_xlim()方法即可为单个子图设置x轴范围。注意loadData在绘制时做了/2000的转换,计算分位数时要对应处理:

import numpy as np
import matplotlib.pyplot as plt

def plotResults(spotData, loadData,\
                    loadTitle = 'Load Simulation Histogram', loadXLabel = 'Simulated Total GWh', loadYLabel = 'frequency'\
                        ,spotTitle = 'Spot Simulation Histogram', spotXLabel = 'Simulated Mean ($/MWh)', spotYLabel = 'frequency'\
                         ,minPercentile = 1, maxPercentile = 99):
  
        fig, axs = plt.subplots(1,2,figsize=(12,6))
        
        # 处理负载数据并设置x轴范围
        load_plot_data = loadData / 2000
        axs[0].hist(load_plot_data, bins = 50)
        # 计算负载数据的百分位数
        load_min = np.percentile(load_plot_data, minPercentile)
        load_max = np.percentile(load_plot_data, maxPercentile)
        axs[0].set_xlim(load_min, load_max)
        axs[0].set_title(loadTitle)
        axs[0].set_xlabel(loadXLabel)
        axs[0].set_ylabel(loadYLabel)
        
        # 处理现货数据并设置x轴范围
        axs[1].hist(spotData, bins = 50)
        # 计算现货数据的百分位数
        spot_min = np.percentile(spotData, minPercentile)
        spot_max = np.percentile(spotData, maxPercentile)
        axs[1].set_xlim(spot_min, spot_max)
        axs[1].set_title(spotTitle)
        axs[1].set_xlabel(spotXLabel)
        axs[1].set_ylabel(spotYLabel)

        plt.show()

关键修改点

  • 先对loadData做/2000转换得到绘图用数据,再计算该数据的百分位数,确保范围与绘图数据匹配
  • 调用ax.set_xlim(最小值, 最大值)为每个子图单独设置x轴范围,过滤掉指定百分位数之外的异常值
  • 修正了参数名拼写错误minPerctile为minPercentile,以及标签文本中的freqency拼写错误为frequency(若不需要可改回原拼写)

内容的提问来源于stack exchange,提问作者mhooper

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 03:08:17