基于输入数据百分位数设置直方图坐标轴范围
基于百分位数设置直方图坐标轴范围以限制异常值
我希望根据输入数据的百分位数为模拟数据设置最小和最大范围,以限制直方图中的异常值。目前已有一个能正常生成图表的函数,但不知道如何为单个直方图设置坐标轴范围。我已经了解如何用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
相关产品推荐
相关产品推荐

