在不影响绘图的情况下更改刻度标签
Changing tick labels without affecting the plot
我正在使用 matplotlib 在 python 中绘制一个二维数组,但在格式化刻度线时遇到了问题。所以首先,我的数据目前被组织为一个二维数组(海拔,纬度)。我正在绘制电子密度值作为高度和纬度的函数(基本上是特定时间的纵向切片)。
我想用 30 度的间隔标记从 -90 到 90 度的 x 轴,并用另一个高程数组标记 y 值(每个模型 运行 都有不同的高程值,所以我不能手动分配任意高程)。我有包含纬度值的数组和另一个包含高程值的数组,这两个数组都是一维数组。
这是我的代码:
from netCDF4 import Dataset
import numpy as np
import matplotlib.pyplot as plt
#load the netcdf file into a variable
mar120="C:/Users/WillEvo/Desktop/sec_giptie_cpl_mar_120.nc"
#grab the data into a new variable
fh=Dataset(mar120,mode="r")
#assign model variable contents to python variables
lons=fh.variables['lon'][:]
lats=fh.variables['lat'][:]
var1=fh.variables['UN'][:]
#specifying which time and elevation to map
ionst=var1[0,:,:,21]
ionst=ionst[0:len(ionst)-1]
#close the netCDF file
fh.close()
#Set the figure, size, and resolution
plt.figure(figsize=(8,6), dpi=100, facecolor='white')
plt.subplot(1,1,1)
plt.imshow(ionst, origin='lower', interpolation='spline16')
plt.xticks([-90, -60, -30, 0, 30, 60, 90])
plt.show()
如果我不包含 plt.xticks 参数,我会得到以下好的图像,但刻度标签不正确:
如果我包含 plt.xticks 参数,我会得到以下结果:
我该如何解决这个问题?我希望数据跟随轴的变化(但要准确)。我还需要为 y 轴执行此操作,但无需手动输入值,而是提供一组值。谢谢
使用imshow
的extent
参数设置图像的x和y范围,使用aspect='auto'
允许调整图像的纵横比以适合图。比如下面的代码
In [68]: from scipy.ndimage.filters import gaussian_filter
In [69]: np.random.seed(12345)
In [70]: a = np.random.randn(27, 36)
In [71]: b = gaussian_filter(a, 4)
In [72]: ymin = 0
In [73]: ymax = 1
In [74]: plt.imshow(b, origin='lower', extent=[-90, 90, ymin, ymax], aspect='auto')
Out[74]: <matplotlib.image.AxesImage at 0x1115f02d0>
In [75]: plt.xticks([-90, -60, -30, 0, 30, 60, 90])
Out[75]:
([<matplotlib.axis.XTick at 0x108307cd0>,
<matplotlib.axis.XTick at 0x1101c1c50>,
<matplotlib.axis.XTick at 0x1115d4610>,
<matplotlib.axis.XTick at 0x1115f0d90>,
<matplotlib.axis.XTick at 0x1115ff510>,
<matplotlib.axis.XTick at 0x11161db10>,
<matplotlib.axis.XTick at 0x111623090>],
<a list of 7 Text xticklabel objects>)
生成此图:
我正在使用 matplotlib 在 python 中绘制一个二维数组,但在格式化刻度线时遇到了问题。所以首先,我的数据目前被组织为一个二维数组(海拔,纬度)。我正在绘制电子密度值作为高度和纬度的函数(基本上是特定时间的纵向切片)。
我想用 30 度的间隔标记从 -90 到 90 度的 x 轴,并用另一个高程数组标记 y 值(每个模型 运行 都有不同的高程值,所以我不能手动分配任意高程)。我有包含纬度值的数组和另一个包含高程值的数组,这两个数组都是一维数组。
这是我的代码:
from netCDF4 import Dataset
import numpy as np
import matplotlib.pyplot as plt
#load the netcdf file into a variable
mar120="C:/Users/WillEvo/Desktop/sec_giptie_cpl_mar_120.nc"
#grab the data into a new variable
fh=Dataset(mar120,mode="r")
#assign model variable contents to python variables
lons=fh.variables['lon'][:]
lats=fh.variables['lat'][:]
var1=fh.variables['UN'][:]
#specifying which time and elevation to map
ionst=var1[0,:,:,21]
ionst=ionst[0:len(ionst)-1]
#close the netCDF file
fh.close()
#Set the figure, size, and resolution
plt.figure(figsize=(8,6), dpi=100, facecolor='white')
plt.subplot(1,1,1)
plt.imshow(ionst, origin='lower', interpolation='spline16')
plt.xticks([-90, -60, -30, 0, 30, 60, 90])
plt.show()
如果我不包含 plt.xticks 参数,我会得到以下好的图像,但刻度标签不正确:
如果我包含 plt.xticks 参数,我会得到以下结果:
我该如何解决这个问题?我希望数据跟随轴的变化(但要准确)。我还需要为 y 轴执行此操作,但无需手动输入值,而是提供一组值。谢谢
使用imshow
的extent
参数设置图像的x和y范围,使用aspect='auto'
允许调整图像的纵横比以适合图。比如下面的代码
In [68]: from scipy.ndimage.filters import gaussian_filter
In [69]: np.random.seed(12345)
In [70]: a = np.random.randn(27, 36)
In [71]: b = gaussian_filter(a, 4)
In [72]: ymin = 0
In [73]: ymax = 1
In [74]: plt.imshow(b, origin='lower', extent=[-90, 90, ymin, ymax], aspect='auto')
Out[74]: <matplotlib.image.AxesImage at 0x1115f02d0>
In [75]: plt.xticks([-90, -60, -30, 0, 30, 60, 90])
Out[75]:
([<matplotlib.axis.XTick at 0x108307cd0>,
<matplotlib.axis.XTick at 0x1101c1c50>,
<matplotlib.axis.XTick at 0x1115d4610>,
<matplotlib.axis.XTick at 0x1115f0d90>,
<matplotlib.axis.XTick at 0x1115ff510>,
<matplotlib.axis.XTick at 0x11161db10>,
<matplotlib.axis.XTick at 0x111623090>],
<a list of 7 Text xticklabel objects>)
生成此图: