numpy 基于子地块形状动态更改地物布局

des4xlb0  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(98)

我目前正在对两个子图中的一些数据进行可视化。这两个子图包含相同的x和y轴,并且都使用相同的方面。我目前可以选择是否将它们显示在彼此旁边或彼此之上,但我希望它根据图的形状自动执行此操作。Flat plot, in subplot(2 by 2) layout but needs to show 2 by 1 favourablyHigh plot, in subplot (2 by 2) layout should be 1 by 2 favourably
图片中的图像只是通过放大特定形状的图来改变。
两个子图的形状总是相同的。
我目前正在使用这段代码来塑造情节,

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider
pcd=np.random.rand(1000,2)*40
mdfig=plt.figure()
ax=mdfig.add_subplot(224)
ax.set_aspect('equal',adjustable='box')
ax.set_title("fine tuned")
axs=mdfig.add_subplot(221,sharex=ax,sharey=ax)
axs.set_aspect('equal',adjustable='box')
axs.set_title("original")
# ax.set_zlim([-1,10])
def on_change(val):
    ax.cla()
    axs.cla()
    ax.set_title("fine tuned")
    ax.axis('scaled')
    axs.set_title("original")
    axs.axis('scaled')
    ax.scatter(pcd[:,0],pcd[:,1],s=5,c='black',label="pointcloud",alpha=freq_slider.val)
    axs.scatter(pcd[:,0],pcd[:,1],s=5,c='black',label="pointcloud",alpha=freq_slider.val)

axfreq = mdfig.add_axes([0.25, 0.1, 0.65, 0.03])
freq_slider = Slider(
    ax=axfreq,
    label='transparency pointcloud',
    valmin=0,
    valmax=1,
    valinit=0,
    valstep=0.01
)
freq_slider.on_changed(on_change)    
plt.show()

字符串

yfwxisqw

yfwxisqw1#

您可以使用gridspec来更改子图的位置。Here是您任务的其他解决方案。
我调用ax.get_xlimax.get_ylim来计算轴的范围。如果x跨度较大,则轴会更长,因为长宽比相等,它会将图设置为一列,否则图将设置为一行。
以下是如何更改on_change方法。x范围是根据提供的值计算的,用于测试目的。

def on_change(val):
    ax.cla()
    axs.cla()
    ax.set_title("fine tuned")
    ax.axis('scaled')
    axs.set_title("original")
    axs.axis('scaled')

    # Dynamic axis range for testing
    ax.set_xlim((0, 90*val))

    # Calculate Range of axis (proportional to axis size
    # because of equal aspect range
    xlim = ax.get_xlim()
    xrange = abs(xlim[1] - xlim[0])

    ylim = ax.get_ylim()
    yrange = abs(ylim[1] - ylim[0])

    if xrange < yrange:
        # vertical plot
        gs = gridspec.GridSpec(1, 2)
    else:
        # flat plot
        gs = gridspec.GridSpec(2, 1)
    ax.set_position(gs[0].get_position(mdfig))
    axs.set_position(gs[1].get_position(mdfig))
    ax.scatter(pcd[:,0],pcd[:,1],s=5,c='black',label="pointcloud",alpha=freq_slider.val)
    axs.scatter(pcd[:,0],pcd[:,1],s=5,c='black',label="pointcloud",alpha=freq_slider.val)

字符串

相关问题