gpt4 book ai didi

python - Bokeh 中具有紧密轴和匹配纵横比的图像图

转载 作者:太空狗 更新时间:2023-10-30 01:25:00 24 4
gpt4 key购买 nike

我在 Django 应用程序中使用 bokeh 1.0.1 版本,我想将微观表面图像显示为带有颜色编码高度和颜色条的可缩放图像图。原则上这是可行的,但是我无法获得具有正确纵横比的图,仅显示没有空间的图像。

这是我想要实现的一个例子:结果图应该

  • 显示宽度为 sx=10 的随机数据图像和 sy=5 的高度在数据空间(图像大小)
  • 轴限制为 (0,sx)(0,sy) , 在初始 View
    和缩放时
  • 屏幕上的正方形应与数据空间中的正方形相匹配,至少在初始 View 中

  • 对于图像,我只使用带有 nx=100 的随机数据指向 x 方向和 ny=100指向 y 方向。

    这是我的第一种方法:

    尝试 1
    from bokeh.models.ranges import Range1d
    from bokeh.plotting import figure, show
    from bokeh.models import LinearColorMapper, ColorBar
    import numpy as np

    sx = 10
    sy = 5

    nx = 100
    ny = 100
    arr = np.random.rand(nx, ny)

    x_range = Range1d(start=0, end=sx, bounds=(0,sx))
    y_range = Range1d(start=0, end=sy, bounds=(0,sy))

    # Attempt 1
    plot = figure(x_range=x_range, y_range=y_range, match_aspect=True)

    # Attempt 2
    # plot = figure(match_aspect=True)

    # Attempt 3
    # pw = 400
    # ph = int(400/sx*sy)
    # plot = figure(plot_width=pw, plot_height=ph,
    # x_range=x_range, y_range=y_range, match_aspect=True)

    color_mapper = LinearColorMapper(palette="Viridis256",
    low=arr.min(), high=arr.max())
    colorbar = ColorBar(color_mapper=color_mapper, location=(0,0))

    plot.image([arr], x=[0], y=[0], dw=[sx], dh=[sy],
    color_mapper=color_mapper)
    plot.rect(x=[0,sx,sx,0,sx/2], y=[0,0,sy,sy,sy/2],
    height=1, width=1, color='blue')

    plot.add_layout(colorbar, 'right')
    show(plot)

    我还在图中添加了蓝色方块,以便查看,当
    纵横比要求失败。

    不幸的是,在 resulting picture ,正方形不再是正方形,它的高度是宽度的两倍。缩放和平移按预期工作。

    尝试 2

    使用省略范围时
    plot = figure(match_aspect=True)

    我会得到 this picture .正方形是屏幕上的正方形,
    这很好,但轴范围改变了,所以有
    现在它周围的空间。我只想拥有被覆盖的数据区域
    图片。

    尝试 3

    或者,当提供 plot_height 时和 plot_width到图,
    具有预定义的纵横比,例如经过
    pw = 800 # plot width
    ph = int(pw/sx*sy)
    plot = figure(plot_width=pw, plot_height=ph,
    x_range=x_range, y_range=y_range,
    match_aspect=True)

    我会得到 this picture .广场也不再是广场了。几乎可以做到,但很难,因为 plot_width 还包括颜色栏和工具栏。

    我已阅读 this corresponding blog post
    和相应的 bokeh documentation ,但我无法让它工作。

    有谁知道如何实现我想要的或者是否不可能?
    响应式行为也很好,但我们现在可以忽略它。
    感谢您的任何提示。

    更新

    Gitter 上与 Bokeh 开发人员交谈后(感谢 Bryan!)看来我想要的几乎是不可能的。

    原因是,怎么 match_aspect=True工作是为了使数据空间中的正方形看起来像像素空间中的正方形:给定 Canvas 大小,这可能是由于应用不同的 sizing_mode响应行为的设置,然后更改数据范围以具有匹配的纵横比。因此,没有其他方法可以使像素纵横比与数据纵横比匹配,而无需在图像周围添加额外空间,即在给定边界上扩展轴。另见此评论 issue .

    没有响应行为,然后根据纵横比预先固定 Canvas 大小是可以完成的,但目前并不完美,因为内部图框周围的所有其他元素也占用空间。有一个 PR这可能允许直接控制内部框架尺寸,但我不知道该怎么做。

    好吧,如果我放弃拥有紧轴的目标怎么办?
    这是在上面的“尝试 2”中完成的,但图像周围有太多空白空间,与图像绘图占用的空间相同。

    我尝试使用各种 range_padding*属性,例如
    x_range = DataRange1d(range_padding=10, range_padding_units='percent')
    y_range = DataRange1d(range_padding=10, range_padding_units='percent')

    但它不会减少情节周围的空间量,而只会增加它。百分比填充应该相对于 dh 给出的图像尺寸。和 dw .

    有谁知道如何使用 range_padding参数具有较小的轴范围或另一种方式在上面的示例中的图像图周围具有较小的填充(使用 match_aspect=True )?
    我已开通 another question在这一点上。

    最佳答案

    你能接受这个解决方案(适用于 Bokeh v1.0.4)吗?

    from bokeh.models.ranges import Range1d
    from bokeh.plotting import figure, show
    from bokeh.layouts import Row
    from bokeh.models import LinearColorMapper, ColorBar
    import numpy as np

    sx = 10
    sy = 5

    nx = 100
    ny = 100
    arr = np.random.rand(nx, ny)

    x_range = Range1d(start = 0, end = sx, bounds = (0, sx))
    y_range = Range1d(start = 0, end = sy, bounds = (0, sy))

    pw = 400
    ph = pw * sy / sx
    plot = figure(plot_width = pw, plot_height = ph,
    x_range = x_range, y_range = y_range, match_aspect = True)

    color_mapper = LinearColorMapper(palette = "Viridis256",
    low = arr.min(), high = arr.max())

    plot.image([arr], x = [0], y = [0], dw = [sx], dh = [sy], color_mapper = color_mapper)
    plot.rect(x = [0, sx, sx, 0, sx / 2], y = [0, 0, sy, sy, sy / 2], height = 1, width = 1, color = 'blue')

    colorbar_plot = figure(plot_height = ph, plot_width = 69, x_axis_location = None, y_axis_location = None, title = None, tools = '', toolbar_location = None)
    colorbar = ColorBar(color_mapper = color_mapper, location = (0, 0))
    colorbar_plot.add_layout(colorbar, 'left')

    show(Row(plot, colorbar_plot))

    结果:

    enter image description here

    关于python - Bokeh 中具有紧密轴和匹配纵横比的图像图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53617819/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com