【问题标题】:Matplotlib: Changing the limits of an axis based on the rangeMatplotlib:根据范围更改轴的限制
【发布时间】:2026-01-11 02:15:01
【问题描述】:

我想根据我的数据的一般范围限制 y 轴边界,避免尖峰但不删除它们。

我正在制作多组图表来比较两组数据。两组都包含一年多的数据,并已使用 pandas 读入数据帧,并且每个月通过循环生成图表。其中一组有埋葬尖峰,导致 y 轴上的范围绘制得过大,导致图表不可读。使用pyplot.ylim() 设置固定边界无济于事,因为数据的一般范围(例如一个月内)因图表而异,并且应用硬限制会降低许多图表的可读性。

例如:一个月可能有数据通常不高于 300,000,但有几个峰值超过 500,000(和低于 -500,000),但另一个月也可能有较大的峰值,但数据确实否则不高于 150,000。

我还尝试使用基于this answerdf2 = df[df.y < 500000] = np.nan 设置对于nan 太大的值,但是折线图中的中断太小而无法看到,并且出现尖峰的事实会丢失。

有什么方法可以确定数据的一般最大和最小范围是多少,以便以合理的方式设置 y 轴范围?

【问题讨论】:

    标签: python-3.x pandas matplotlib


    【解决方案1】:

    在我写这个问题的时候,我发生了一些事情,我通过复制数据框,删除非常大的值,然后检查剩余数据的最大值和最小值来解决它。

    def check_min_max(selected, selected2):
        max_test = selected2.copy(deep=True)
        
        #remove very large values
        max_test[(max_test[measurements_col] > 500000) | (max_test[measurements_col] < -500000)] = np.nan
        
        #get new max and min y-values
        measurements_y_max = max_test[measurements_col].max()
        measurements_y_min = max_test[measurements_col].min()
    
        results_y_max = selected[results_col].max()
        results_y_min = selected[results_col].min()
        
        if measurements_y_max > results_y_max:
            y_max = measurements_y_max
        else:
            y_max = results_y_max
            
        if measurements_y_min > 0 or results_y_min > 0:
            y_min = 0 - (y_max * 0.01)
        elif measurements_y_min < results_y_min:
            y_min = measurements_y_min
        else:
            y_min = results_y_min
        
        return(y_min + (y_min * 0.05), y_max + (y_max * 0.05)) # add 5% to range for readability
    

    我也知道在数据帧被传递给函数后不需要复制它。在将其移至函数之前,我最初将其作为代码的一部分编写并且尚未更改

    【讨论】: