【问题标题】:Python- compress lower end of y-axis in contourf plotPython-在contourf图中压缩y轴的下端
【发布时间】:2020-12-01 21:45:50
【问题描述】:

问题

我有一个使用 pandas 数据框制作的轮廓图,它在 x 轴上绘制了一些二维值,在 x 轴上绘制了时间,在 y 轴上绘制了垂直压力水平。我要提取的字段、时间和压力数据均来自 netCDF 文件。我可以很好地绘制它,但我想缩放 y 轴以更好地代表真实的气氛。 (默认缩放是线性的,但文件中的压力水平意味着不同的缩放之王。)基本上,它应该看起来像下面 y 轴上的图。它就像一个对数刻度,但压缩轴的底部而不是顶部。 (我不知道这个术语......就像一个对数刻度但是倒置的?)它不需要精确。

工作示例(用 Jupyter 笔记本编写)

#modules
import numpy             as np
import pandas            as pd
import matplotlib.pyplot as plt
from   matplotlib        import ticker, colors

#data
time = np.arange(0,10)
lev  = np.array([900,800,650,400,100])
df = pd.DataFrame(np.arange(50).reshape(5,10),index=lev,columns=time)
df.index.name = 'Level'
print(df)
        0   1   2   3   4   5   6   7   8   9
Level                                        
900     0   1   2   3   4   5   6   7   8   9
800    10  11  12  13  14  15  16  17  18  19
650    20  21  22  23  24  25  26  27  28  29
400    30  31  32  33  34  35  36  37  38  39
100    40  41  42  43  44  45  46  47  48  49
#lists for plotting
levtick = np.arange(len(lev))
clevels = np.arange(0,55,5)

#Main plot
fig, ax = plt.subplots(figsize=(10, 5))
im      = ax.contourf(df,levels=clevels,cmap='RdBu_r')

#x-axis customization
plt.xticks(time)
ax.set_xticklabels(time)
ax.set_xlabel('Time')

#y-axis customization
plt.yticks(levtick)
ax.set_yticklabels(lev)
ax.set_ylabel('Pressure')

#title and colorbar
ax.set_title('Some mean time series')
cbar = plt.colorbar(im,values=clevels,pad=0.01)
tick_locator = ticker.MaxNLocator(nbins=11)
cbar.locator = tick_locator
cbar.update_ticks()

问题

如何缩放 y 轴,以便压缩底部 (900、800) 附近的值,同时扩展顶部 (200) 附近的值并提供更多绘图空间,就像在我的代码上方的示例中一样?我尝试使用ax.set_yscale('function', functions=(forward, inverse)),但不明白它是如何工作的。我也尝试过简单的ax.set_yscale('log'),但日志不是我需要的。

【问题讨论】:

    标签: python pandas numpy matplotlib scaling


    【解决方案1】:

    您可以按照您的建议使用带有ax.set_yscale('function', functions=(forward, inverse)) 的自定义比例转换。来自documentation

    forwardinverse 是返回缩放变换的可调用对象 和它的倒数。

    在这种情况下,请在forward() 中定义您想要的函数,例如 log 函数的逆函数,或者根据您的需要自定义一个。在自定义 y 轴之前调用此函数。

    def forward(x):
        return 2**x
    
    def inverse(x):
        return np.log2(x)
    
    ax.set_yscale('function', functions=(forward,inverse))
    

    【讨论】:

    • 我在正向和反向函数上进行了缩放。使用 1.1**x 和 0.1*np.log(x),我得到了一个不那么夸张的缩放比例,看起来效果很好。我不确定正向和反向究竟是如何工作的,但我可以将这个问题留到另一篇文章中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-05
    • 2010-09-28
    • 2011-03-24
    • 1970-01-01
    • 2023-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多