【发布时间】: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