当前位置: 首页 > 知识库问答 >
问题:

如何保持bbox在3面紧密,并使用颜色条对不同的图保持恒定

冷涵忍
2023-03-14

我需要不同变量的雷达图像图具有相同的大小,以便我可以在网页上垂直对齐它们。

单位不同,颜色栏的宽度(包括刻度标签和标签)也相应变化,因为某些颜色栏的刻度值为负值,只需要比其他颜色栏更多的空间。但是,在savefig命令中使用bbox_inches=“tight”选项会导致不同的图形宽度。如果我嵌入绘图,它们会调整大小,但图形中绘制数据的框也会调整,框不再对齐。

现在看起来怎么样。时间轴未完全对齐,因为下部绘图的色条较宽。

有没有一种方法可以防止bbox一侧太紧,但在设置固定的图像宽度时,另一侧太紧?

下面是我使用的代码的简化版本:

    import numpy as np
    import matplotlib.pyplot as plt
    import pylab

    method=1
    fs=12
    height=600
    width=3200
    my_dpi=200

    x, y = np.meshgrid(np.linspace(0,1000,100),np.linspace(0,31*100,32))
    if method ==1:
        z=numpy.random.rand(32,100)
    else:
        z=-3*numpy.random.rand(32,100)

    plt.figure(figsize=(width/my_dpi, height/my_dpi), dpi=my_dpi)
    plt.pcolor(x,y,z,cmap='jet', vmin=z.min(), vmax=z.max())
    cbar=plt.colorbar()

    plt.ylabel('Height above Radar [m]',fontsize=fs)
    plt.xlabel('Time UTC',fontsize=fs)

    plt.title("MRR roof 20150729")

    plt.axis([x.min(), x.max(),y.min(), y.max()])
    cbar.set_label('Reflectivity [dBZ]', rotation=90)

    plotname="somename"+str(method)+".png"
    pylab.savefig(plotname,dpi=my_dpi,bbox_inches='tight')

PS:使用子绘图不是一个选项,因为实际的网页将使用JavaScript,并且绘图可以单独更改。

共有2个答案

扈翰
2023-03-14

我找到了一个解决方案,这是i. m. o.比Diziet Asahi的答案更优雅一点(无论如何,谢谢。你的回答是这个解决方案的灵感)。我从这里改编的。

它不是插入一个垫子并将颜色栏标签向右对齐,而是手动将颜色栏标签插入为文本,这将使颜色栏标签保持在每个变量的相同位置:

plt.text(1.065, .5, cbar_title,  fontsize=fs,
verticalalignment='center',rotation = 90, transform = ax.transAxes)

此外,我在plt中添加了pad=0.01。colorbar()命令,将colorbar移动到更靠近绘图的位置,这样看起来会更好。

以下是完整的代码:

import numpy as np
import matplotlib.pyplot as plt

method=2
fs=12
height=600
width=3200
my_dpi=200

x, y = np.meshgrid(np.linspace(0,1000,100),np.linspace(0,31*100,32))
if method ==1:
    z=np.random.rand(32,100)
else:
    z=-3*np.random.rand(32,100)

fig = plt.figure(figsize=(width/my_dpi, height/my_dpi), dpi=my_dpi)
ax = fig.add_subplot(111)
a = ax.pcolor(x,y,z,cmap='jet', vmin=z.min(), vmax=z.max())
ax.set_ylabel('Height above Radar [m]',fontsize=fs)
ax.set_xlabel('Time UTC',fontsize=fs)
ax.set_title("MRR roof 20150729")
plt.axis([x.min(), x.max(),y.min(), y.max()])

cbar = plt.colorbar(a,pad=0.01)
cbar_title='Reflectivity [dBZ]'
plt.text(1.065, .5, cbar_title, fontsize=fs, verticalalignment='center',
         rotation = 90, transform = ax.transAxes)

plotname="somename"+str(method)+".png"
plt.savefig(plotname,dpi=my_dpi, bbox_inches='tight')

结果可以在这里看到。

张翰海
2023-03-14

这可能不是最优雅的解决方案,但您可以将颜色栏的勾号标签向右对齐,并提供填充,这样它们就不会与颜色栏冲突。

需要对填充进行调整,使其在不考虑数据范围的情况下工作

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

method=1
fs=12
height=600
width=3200
my_dpi=200

x, y = np.meshgrid(np.linspace(0,1000,100),np.linspace(0,31*100,32))
if method ==1:
    z=np.random.rand(32,100)
else:
    z=-3*np.random.rand(32,100)

fig = plt.figure(figsize=(width/my_dpi, height/my_dpi), dpi=my_dpi)
ax = fig.add_subplot(111)
a = ax.pcolor(x,y,z,cmap='jet', vmin=z.min(), vmax=z.max())
ax.set_ylabel('Height above Radar [m]',fontsize=fs)
ax.set_xlabel('Time UTC',fontsize=fs)
ax.set_title("MRR roof 20150729")
plt.axis([x.min(), x.max(),y.min(), y.max()])

cbar = plt.colorbar(a)
cbar.set_label('Reflectivity [dBZ]', rotation=90)
for T in cbar.ax.yaxis.get_ticklabels():
    T.set_horizontalalignment('right')
cbar.ax.yaxis.set_tick_params(pad=30)

plotname="somename"+str(method)+".png"
plt.savefig(plotname,dpi=my_dpi, bbox_inches='tight')
 类似资料:
  • 关于 Adobe 应用程序中的色彩管理 Adobe 色彩管理可以帮助您在不同的源之间保持图像的色彩一致,编辑文档并在 Adobe 应用程序间转换文档,以及输出已完成的合成图像。此系统基于国际色彩协会 (ICC) 开发的协定,该组织负责实现配置文件格式和程序的标准化,旨在通过一个工作流程获得准确和一致的颜色。 默认情况下, Adobe 应用程序中的色彩管理是打开的。如果您购买了 Adobe Crea

  • 关于 Adobe 应用程序中的色彩管理 Adobe 色彩管理可以帮助您在不同的源之间保持图像的色彩一致,编辑文档并在 Adobe 应用程序间转换文档,以及输出已完成的合成图像。此系统基于国际色彩协会 (ICC) 开发的协定,该组织负责实现配置文件格式和程序的标准化,旨在通过一个工作流程获得准确和一致的颜色。 默认情况下,Adobe 应用程序中的色彩管理是打开的。如果您购买了 Adobe Creat

  • 问题内容: 我有一些最初存储在通用Javascript对象中的数据,其ID为键: 但是,我发现浏览器在循环浏览时并不能保证特定的对象顺序,因此在上面的“ 3”将出现在“ 7”之前。我改用这样的数组格式: 现在,我可以按正确的顺序循环,但是不能进行快速查找,例如,不必循环遍历数组。 是否有结合两种方法的好方法?我宁愿避免为每种格式使用单独的对象,因为该对象非常大(数百个元素)。 问题答案: 我也遇到

  • 我正在创建一个侧边栏导航面板,其中一些链接是持有的,我想要他们显示侧身。下面是当前的导航面板: 分解一下: 菜单图标 下面是图标的HTML 它是CSS: HTML: CSS: 当我将添加到类时,结果如下所示: 我怎样才能旋转这些并且仍然使它们居中?谢谢!

  • 我正在尝试渲染视频。但我想以恒定速度渲染它。示例: ffmpeg-stream_loop-1113856_video_0.ts-c: v复制-c: a aac-bufsize3600k-maxrate1800k-rtbufsize15M-元数据注释="屏幕113856"-预设超快-g 50-r 4-sc_threshold0-crf 0-线程1out.mp4 这个ffmpeg可以很好地呈现视频,像

  • 我想用一个新的图例替换matplotlib图例,但保留被替换图例的相同(可能是任意)位置。 为什么下面的代码不能工作?