- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有 4 个不同值的 map ,我想用 matplotlib Basemap 将它们一起绘制为 1 个图中的 4 个子图,每个子图都有自己的颜色条。但我设置颜色条和子图大小和方向的努力似乎失败了(请参阅下面的代码)。有人知道我做错了什么吗?使用 basemap 时是否无法自定义子图和颜色条设置?
import math
import matplotlib.cm as cm
import matplotlib.colors as colors
import matplotlib.image as mpimg
import matplotlib as mpl
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
import numpy.ma as ma
import numpy as np
import pylab
# Create Variables:
B = np.full((4,60,360), np.nan)
B[0] = np.random.randint(16, size=(60, 360)) + 291
B[1] = np.random.randint(201, size=(60, 360)) - 100
B[2] = np.random.randint(56, size=(60, 360)) - 50
B[3] = np.random.randint(46, size=(60, 360))
# Colorbar Boundary Definitions:
cmap_1 = cm.jet
cmap_2 = cm.BrBG
cmap_3 = cm.hot
cmap_4 = cm.CMRmap_r
B_plot = np.ma.array ( B, mask=np.isnan(B))
bounds_B = []
norm_B = []
for b in np.arange(4):
bounds_B.append(b)
norm_B.append(b)
bounds_B[0] = np.arange(291, 306, 1)
bounds_B[1] = np.arange(-100, 110, 10)
bounds_B[2] = np.arange(-50, -7.5, 2.5)
bounds_B[3] = np.arange(0, 47.5, 2.5)
norm_B[0] = mpl.colors.BoundaryNorm(bounds_B[0], cmap_1.N)
norm_B[1] = mpl.colors.BoundaryNorm(bounds_B[1], cmap_2.N)
norm_B[2] = mpl.colors.BoundaryNorm(bounds_B[2], cmap_3.N)
norm_B[3] = mpl.colors.BoundaryNorm(bounds_B[3], cmap_4.N)
lat = (-1) * (np.arange(-29.5, 30.5, 1))
lon = np.arange(0.5, 360.5, 1)
llc_LON = 0.5
urc_LON = 359.5
llc_LAT = -29.5
urc_LAT = 29.5
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(9, 5))
# Variable 1
m1 = Basemap(projection='cyl', llcrnrlon=llc_LON, urcrnrlon=urc_LON, llcrnrlat=llc_LAT, urcrnrlat=urc_LAT, resolution='c')
m1.drawcoastlines(color='k')
m1.fillcontinents(color='white') # mask land mass
lons, lats = np.meshgrid(lon,lat)
x, y = m1(lons,lats)
m1.pcolor(x, y, B_plot[0], cmap=cmap_1, norm=norm_B[0])
img_1 = m1.pcolor(x, y, B_plot[0], cmap=cmap_1, norm=norm_B[0])
axes[0, 0].set_title('Variable 1')
axes[0, 0].set_xlim(llc_LON, urc_LON)
axes[0, 0].set_xticks([0, 45, 90, 135, 180, 225, 270, 315, 360], ['0', '45E', '90E', '135E', '180', '135W', '90W', '45W', '0']) # 0E to 360E
axes[0, 0].set_ylim(llc_LAT, urc_LAT)
axes[0, 0].set_yticks([-30, -15, 0, 15, 30], ['30S', '15S', '0', '15N', '30N']) # 30S to 30N
axes[0, 0].set_ylabel('Latitude')
plt.grid()
# Variable 2
m2 = Basemap(projection='cyl', llcrnrlon=llc_LON, urcrnrlon=urc_LON, llcrnrlat=llc_LAT, urcrnrlat=urc_LAT, resolution='c')
m2.drawcoastlines(color='k')
m2.fillcontinents(color='white') # mask land mass
lons, lats = np.meshgrid(lon,lat)
x, y = m2(lons,lats)
m2.pcolor(x, y, B_plot[1], cmap=cmap_2, norm=norm_B[1])
img_2 = m2.pcolor(x, y, B_plot[1], cmap=cmap_2, norm=norm_B[1])
axes[0, 1].set_title('Variable 2')
axes[0, 1].set_xlim(llc_LON, urc_LON)
axes[0, 1].set_xticks([0, 45, 90, 135, 180, 225, 270, 315, 360], ['0', '45E', '90E', '135E', '180', '135W', '90W', '45W', '0']) # 0E to 360E
axes[0, 1].set_ylim(llc_LAT, urc_LAT)
axes[0, 1].set_yticks([-30, -15, 0, 15, 30], ['30S', '15S', '0', '15N', '30N']) # 30S to 30N
plt.grid()
# Variable 3
m3 = Basemap(projection='cyl', llcrnrlon=llc_LON, urcrnrlon=urc_LON, llcrnrlat=llc_LAT, urcrnrlat=urc_LAT, resolution='c')
m3.drawcoastlines(color='k')
m3.fillcontinents(color='white') # mask land mass
lons, lats = np.meshgrid(lon,lat)
x, y = m3(lons,lats)
m3.pcolor(x, y, B_plot[2], cmap=cmap_3, norm=norm_B[2])
img_3 = m3.pcolor(x, y, B_plot[2], cmap=cmap_3, norm=norm_B[2])
axes[1, 0].set_title('Variable 3')
axes[1, 0].set_xlim(llc_LON, urc_LON)
axes[1, 0].set_xticks([0, 45, 90, 135, 180, 225, 270, 315, 360], ['0', '45E', '90E', '135E', '180', '135W', '90W', '45W', '0']) # 0E to 360E
axes[1, 0].set_ylim(llc_LAT, urc_LAT)
axes[1, 0].set_yticks([-30, -15, 0, 15, 30], ['30S', '15S', '0', '15N', '30N']) # 30S to 30N
axes[1, 0].set_ylabel('Latitude')
plt.grid()
# Variable 4
m4 = Basemap(projection='cyl', llcrnrlon=llc_LON, urcrnrlon=urc_LON, llcrnrlat=llc_LAT, urcrnrlat=urc_LAT, resolution='c')
m4.drawcoastlines(color='k')
m4.fillcontinents(color='white') # mask land mass
lons, lats = np.meshgrid(lon,lat)
x, y = m4(lons,lats)
m4.pcolor(x, y, B_plot[3], cmap=cmap_4, norm=norm_B[3])
img_4 = m4.pcolor(x, y, B_plot[3], cmap=cmap_4, norm=norm_B[3])
axes[1, 1].set_title('Variable 4')
axes[1, 1].set_xlim(llc_LON, urc_LON)
axes[1, 1].set_xticks([0, 45, 90, 135, 180, 225, 270, 315, 360], ['0', '45E', '90E', '135E', '180', '135W', '90W', '45W', '0']) # 0E to 360E
axes[1, 1].set_ylim(llc_LAT, urc_LAT)
axes[1, 1].set_yticks([-30, -15, 0, 15, 30], ['30S', '15S', '0', '15N', '30N']) # 30S to 30N
plt.grid()
plt.subplots_adjust(bottom=0.1, hspace=0.2)
colorbar_1 = fig.add_axes([0.1, 0.48, 0.30, 0.015])
fig.colorbar(img_1, cax=colorbar_1, orientation="horizontal", label='Unit 1', ticks=[291, 293, 295, 297, 299, 301, 303, 305])
colorbar_2 = fig.add_axes([0.55, 0.48, 0.30, 0.015])
fig.colorbar(img_2, cax=colorbar_2, orientation="horizontal", label='Unit 2', ticks=[-100, -80, -60, -40, -20, 0, 20, 40, 60, 80, 100])
plt.subplots_adjust(bottom=0.05, right=0.80, left=0.21, hspace=0.2)
colorbar_3 = fig.add_axes([0.1, 0.08, 0.30, 0.015])
fig.colorbar(img_3, cax=colorbar_3, orientation="horizontal", label='Unit 3', ticks=[-50, -45, -40, -35, -30, -25, 20, -15, -10])
colorbar_4 = fig.add_axes([0.55, 0.08, 0.30, 0.015])
fig.colorbar(img_4, cax=colorbar_4, orientation="horizontal", label='Unit 4', ticks=[0, 5, 10, 15, 20, 25, 30, 35, 40, 45])
plt.show()
最佳答案
主要问题是如何定义绘图栏
。在这里,我使用 for
循环中的当前轴来执行此操作。另外,xthick
不会显示,为了显示它们,我使用了set_xticklabels
。
然后,我清理了你的代码,因为你大部分时间都在做 4 次同样的事情。
import math
import matplotlib.cm as cm
import matplotlib.colors as colors
import matplotlib.image as mpimg
import matplotlib as mpl
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
import numpy.ma as ma
import numpy as np
import pylab
# Create Variables:
B = np.array([np.random.randint(16, size=(60, 360)) + 291,
np.random.randint(201, size=(60, 360)) - 100,
np.random.randint(56, size=(60, 360)) - 50,
np.random.randint(46, size=(60, 360))])
# Colorbar Boundary Definitions:
cmap = [cm.jet, cm.BrBG, cm.hot, cm.CMRmap_r]
B_plot = np.ma.array(B, mask=np.isnan(B))
norm_B = []
bounds_B = [np.arange(291, 306, 1),
np.arange(-100, 110, 10),
np.arange(-50, -7.5, 2.5),
np.arange(0, 47.5, 2.5)]
for b in np.arange(4):
norm_B.append(mpl.colors.BoundaryNorm(bounds_B[b], cmap[b].N))
lat = (-1) * (np.arange(-29.5, 30.5, 1))
lon = np.arange(0.5, 360.5, 1)
llc_LON = 0.5
urc_LON = 359.5
llc_LAT = -29.5
urc_LAT = 29.5
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(9, 5))
thicks = [[291, 293, 295, 297, 299, 301, 303, 305],
[-100, -80, -60, -40, -20, 0, 20, 40, 60, 80, 100],
[-50, -45, -40, -35, -30, -25, 20, -15, -10],
[0, 5, 10, 15, 20, 25, 30, 35, 40, 45]]
lons, lats = np.meshgrid(lon, lat)
for row_ind in range(2):
for col_ind in range(2):
index = row_ind*2+col_ind
current_ax = axes[row_ind, col_ind]
print("row_ind: {0} col_ind: {1} index: {2}".format(row_ind, col_ind, index))
map = Basemap(projection='cyl', llcrnrlon=llc_LON, urcrnrlon=urc_LON,
llcrnrlat=llc_LAT, urcrnrlat=urc_LAT, resolution='c',
ax=current_ax)
map.drawcoastlines(color='k')
map.fillcontinents(color='white') # mask land mass
x, y = map(lons, lats)
img_colors = map.pcolor(x, y, B_plot[index], cmap=cmap[index], norm=norm_B[index])
fig.colorbar(img_colors, ax=current_ax, orientation="horizontal",
label='Unit ' + str(index+1), ticks=thicks[index])
current_ax.set_title('Variable ' + str(index+1))
current_ax.set_xlim(llc_LON, urc_LON)
current_ax.set_xticks([0, 45, 90, 135, 180, 225, 270, 315, 360])
current_ax.set_xticklabels(['0', '45E', '90E', '135E', '180', '135W', '90W', '45W', '0']) # 0E to 360E
current_ax.set_ylim(llc_LAT, urc_LAT)
current_ax.set_yticks([-30, -15, 0, 15, 30]) # 30S to 30N
current_ax.set_yticklabels(['30S', '15S', '0', '15N', '30N'])
current_ax.set_ylabel('Latitude')
fig.suptitle('My maps')
plt.show()
关于python - Matplotlib basemap : Customize Subplot and Colorbar Placements,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56750056/
目的 在各种各样的理论计算中,常常需要绘制各种填充图,绘制完后需要加渐变填充的colorbar。可是有些软件如VMD,colorbar渲染后颜色分布有些失真,不能较准确的表达各颜色对应的数值。用p
我正在尝试做一些我通常认为微不足道但在 Bokeh 中似乎非常困难的事情:将垂直颜色条添加到绘图中,然后将颜色条的标题(也就是颜色映射背后的变量)显示在一侧颜色条,但从水平方向顺时针旋转 90 度。
我有一个与 this 中的问题类似的问题发布。 我有一个灰度图像并在其上绘制点。来回绘制点我使用 colormap('jet') 但是因为我希望图像是灰度的,所以在绘制点之后我重置了颜色图,color
我在 matlab 中有二维线图,其中每条线都根据一个值着色。我想添加一个颜色条,显示与这些值对应的颜色。 我得到了一个根据我想要的值绘制线条的解决方案,但是我无法弄清楚如何正确获取颜色条。我一直在搜
我有一个颜色列表 ( created from values ) 并想在颜色栏中显示它们(作为图例,每种颜色的含义)。像这样。 一种方法是使用 1 行/n 列 (n = 25-100) 的表格,每列代
我用一个愚蠢的问题来打扰你,但我找不到遮阳篷。我正在尝试使用 matplotlib 向图像添加颜色条。当我尝试格式化颜色条的刻度时,问题就来了。我想要一个科学记数法格式,但同时控制刻度中的小数位数。例
创建 matplotlib 颜色条时,可以将 drawedges 设置为 True,用黑线分隔颜色条的颜色。但是,当使用 extend='both' 扩展颜色栏时,四肢的黑线不会显示。那是一个错误吗?
我有一些数据,比如x、y和z。全部都是1D数组。我已经制作了一个散点图,其中 z 的颜色为; import matplotlib.pyplot as plt plt.scatter(x,y,c=z
我尝试使用 matplotlib 限制颜色条的范围。旧的行为是,可以使用 plot 函数的 vmin 和 vmax 关键字来缩放颜色条。这会影响颜色本身和颜色条的标签。 现在的行为似乎是,只有颜色被缩
这个问题在这里已经有了答案: How do I use colorbar with hist2d in matplotlib.pyplot? (2 个答案) 关闭 5 年前。 我正在尝试用 Pyth
如何在 matplotlib 中准确指定颜色条标签?我经常需要创建非常具体的色标,但颜色条标签显示效果很差,您无法分辨色标是什么。我想手动定义颜色条刻度线旁边的文本,或者至少让它们以科学记数法显示。
在下面的简单代码中: dat = np.linspace(0.1,0.9,4)*np.ones((4,1)) fig, ax = plt.subplots() cax = ax.imshow(dat,
我正在使用下面的代码 d3 = vals; n = datesmonth; figure plot(n,d3); colormap(jet(12)); hold on plot(n, d3,'b-')
考虑以下示例: [ X, Y, Z ] = peaks( 30 ); figure( 100 ); surfc( X, Y, Z ); zlabel( 'Absolute Values' ); col
我有一个 pcolormesh 图,其中通过将 vmin 和 vmax 严格设置在绘制值的范围内来裁剪颜色图.有没有办法让关联的 colorbar 从底部和顶部分离一个 block ,以表示相关颜色超
绘制颜色条时,顶部标签(我想这将称为偏移量)居中错误。这在过去不会发生,我有旧代码的示例,它位于颜色条上方的中心,但我不知道发生了什么变化。 例子: import numpy as np import
我想更改下图中颜色栏中的刻度定位器和标签。 import pandas as pd import matplotlib.pyplot as plt from matplotlib import dat
我正在尝试在我的 matpllotlib contourf 图上自定义颜色条。虽然我能够使用科学记数法,但我正在尝试更改记数法的基础 - 本质上是让我的刻度在 (-100,100) 范围内,而不是 (
直到最近,我一直在使用 Mathematica 绘制绘图。虽然这真的很痛苦,而且一切都必须手动完成,但结果非常接近我想要的。一个例子如下: 我非常喜欢颜色栏背景中的灰色圆角矩形。虽然一切都必须在 Ma
我正在尝试更新 Bokeh 中的 ColorBar,但标题和颜色本身都不会更新。这是一个最小的功能示例(Python 3.6.9、Bokeh 2.3.0、Tornado 6.1): from boke
我是一名优秀的程序员,十分优秀!