草庐IT

Python Matplotlib 线图与轮廓/imshow 对齐

coder 2023-08-19 原文

如何使用 Python 和 Matplotlib 将一个子图的视觉宽度设置为等于另一个子图的宽度?第一个图具有固定的纵横比和来自 imshow 的方形像素。然后我想在其下方放置一个线图,但我无法这样做并使所有内容对齐。

我相当确定解决方案涉及关于此 Transform Tutorial 的信息页。我试过使用 fig.transFigure、ax.transAxes、ax.transData 等,但没有成功。我需要在上面板中找到轴的宽度和高度以及偏移量,然后能够在下面板中设置轴的宽度、高度和偏移量。不应包含轴标签和刻度等或更改对齐方式。

例如下面的代码

fig = plt.figure(1)
fig.clf()

data = np.random.random((3,3))
xaxis = np.arange(0,3)
yaxis = np.arange(0,3)

ax = fig.add_subplot(211)
ax.imshow(data, interpolation='none')
c = ax.contour(xaxis, yaxis, data, colors='k')

ax2 = fig.add_subplot(212)

最佳答案

matplotlib 轴的轮廓由三件事控制:

  1. 图中轴的边界框(由子图规范或特定范围控制,例如 fig.add_axes([left, bottom, width, height])。轴限制(不是计数刻度标签)将始终在此框内。
  2. adjustable 参数控制是否通过更改数据限制或轴“框”的形状来适应限制或纵横比的变化。这可以是 "datalim""box""box-forced"。 (后者用于共享轴。)
  3. 轴限制和纵横比。对于具有固定纵横比的绘图,轴框或数据限制(取决于 adjustable)将更改以保持指定的纵横比。纵横比指数据坐标,直接指坐标轴的形状。

对于最简单的情况:

import numpy as np
import matplotlib.pyplot as plt

fig, axes = plt.subplots(nrows=2)

data = np.random.random((3,3))
xaxis = np.arange(0,3)
yaxis = np.arange(0,3)

axes[0].imshow(data, interpolation='none')
c = axes[0].contour(xaxis, yaxis, data, colors='k')

axes[1].set_aspect(1)

plt.show()


共享轴

但是,如果您想确保它无论如何都保持相同的形状,并且您可以接受两个具有相同数据限制的图,您可以这样做:

import numpy as np
import matplotlib.pyplot as plt

fig, axes = plt.subplots(nrows=2), sharex=True, sharey=True)
plt.setp(axes.flat, adjustable='box-forced')

data = np.random.random((5,3))
xaxis = np.arange(0,3)
yaxis = np.arange(0,5)

axes[0].imshow(data, interpolation='none')
c = axes[0].contour(xaxis, yaxis, data, colors='k')

axes[1].plot([-0.5, 2.5], [-0.5, 4.5])
axes[1].set_aspect(1)

plt.show()

但是,您可能会注意到这看起来不太正确。这是因为根据我们绘制事物的顺序,第二个子图控制着第一个子图的范围。

基本上,对于共享轴,我们最后绘制的任何内容都将控制初始范围,因此如果我们只是交换我们绘制的顺序:

    import numpy as np
    import matplotlib.pyplot as plt

    fig, axes = plt.subplots(nrows=2, sharex=True, sharey=True)
    plt.setp(axes.flat, adjustable='box-forced')

    data = np.random.random((5,3))
    xaxis = np.arange(0,3)
    yaxis = np.arange(0,5)

    axes[1].plot([-0.5, 2.5], [-0.5, 4.5])
    axes[1].set_aspect(1)

    axes[0].imshow(data, interpolation='none')
    c = axes[0].contour(xaxis, yaxis, data, colors='k')

    plt.show()

当然,如果您不关心所链接图的交互式缩放/平移,您可以完全跳过共享轴,而只是为了:

import numpy as np
import matplotlib.pyplot as plt

fig, axes = plt.subplots(nrows=2)

data = np.random.random((5,3))
xaxis = np.arange(0,3)
yaxis = np.arange(0,5)

axes[0].imshow(data, interpolation='none')
c = axes[0].contour(xaxis, yaxis, data, colors='k')

axes[1].plot([-0.5, 2.5], [-0.5, 4.5])

# Copy extents and aspect from the first axes...
axes[1].set_aspect(axes[0].get_aspect())
axes[1].axis(axes[0].axis())

plt.show()

非共享轴

如果您不希望两个轴具有相同的数据范围,可以强制它们具有相同的大小(但如果您交互式缩放,它们将不会链接)。为此,您需要根据第二个图的范围和第一个图的范围/纵横比来计算第二个图的纵横比。

import numpy as np
import matplotlib.pyplot as plt

fig, axes = plt.subplots(nrows=2)

data = np.random.random((3,3))
xaxis = np.arange(0,3)
yaxis = np.arange(0,3)

axes[0].imshow(data, interpolation='none')
c = axes[0].contour(xaxis, yaxis, data, colors='k')

axes[1].plot(np.linspace(0, 10, 100), np.random.normal(0, 1, 100).cumsum())

# Calculate the proper aspect for the second axes
aspect0 = axes[0].get_aspect()
if aspect0 == 'equal':
    aspect0 = 1.0
dy = np.abs(np.diff(axes[1].get_ylim()))
dx = np.abs(np.diff(axes[1].get_xlim()))

aspect = aspect0 / (float(dy) / dx)
axes[1].set_aspect(aspect)

plt.show()

关于Python Matplotlib 线图与轮廓/imshow 对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26985210/

有关Python Matplotlib 线图与轮廓/imshow 对齐的更多相关文章

  1. python - python的进化路线图是什么 - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭11年前。在哪里可以找到python的中期或长期路线图。借此,我可以了解决策者最关心的是什么,以及他们眼中这门语言的future是什么?一段时间以来,我一直在玩弄Python和Ruby,制作我在开发中需要的中小型工具,通过比较不同但相似的语言来获得乐趣和学习。Python和Ruby的许多特性可以互换,或者易于模仿。两者都引入了一些函数式风格并且发展迅速(Py300

  2. 微信小程序顶部标题栏与胶囊对齐 - 2

    介绍    最近在做微信小程序时,顶部标题栏总是与胶囊对不齐。往往是在这款手机上对齐了,在另外一款手机差很多。我在查阅资料后,提出了一种方法解决这个问题,即:在页面onLoad或组件created时,利用微信小程序提供的API,获取系统状态栏高度和胶囊信息,进而动态调整顶部标题栏样式。在苹果、小米、荣耀手机做验证,能做到精准对齐。理论        胶囊样式应该是垂直居中,有1px的border,border-radius为18px。        若要使顶部标题栏与胶囊对齐,则其高度必须是导航栏高度,标题栏内容也要垂直居中,顶部标题栏的外边距或内边距必须是状态栏高度。        如果顶部

  3. ruby - Prawn :有没有办法让一个盒子里的所有内容垂直对齐? - 2

    我正在尝试将一些内容垂直居中放置在bounding_box中。对于单个文本,这没问题:bounding_box([0,bounds.top],:width=>pdf.bounds.right,:height=>pdf.bounds.top)dotext"verticallyalignedinthesurroundingbox",:valign=>:centerend但是如果我的边界框中有多个元素,我该怎么办:bounding_box([0,bounds.top],:width=>pdf.bounds.right,:height=>pdf.bounds.top)dotext"vertic

  4. Java学习路线图 - 2

    好看的皮囊千篇一律、有趣的灵魂万里挑一文章持续更新,可以微信搜索【小奇JAVA面试】第一时间阅读,回复【资料】获取福利,回复【项目】获取项目源码,回复【简历模板】获取简历模板,回复【学习路线图】获取学习路线图。文章目录一、Java基础二、MySql三、Oracle四、SSM五、设计模式六、前端七、架构八、总结一、Java基础Java基础语言基础流程控制字符串数组类和对象包装类数字处理类接口、继承与多态异常处理集合类I/O反射枚举类型与泛型多线程二、MySqlMySqlMysql数据类型流程控制操作数据库数组创建、修改、删除表索引视图触发器查询数据插入、更新、删除数据MySql运算符MySql函

  5. ruby - 如何将 ruby 字符串向左或向右对齐? - 2

    我有几个ruby字符串,我想适本地左右对齐。我现在使用"Name".center(20,"")获取"(7spaces)Name(8spaces)"如何实现"Name(15spaces)"或"(15spaces)Name"谢谢。 最佳答案 "Name".ljust(19)"Name".rjust(19) 关于ruby-如何将ruby字符串向左或向右对齐?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/

  6. javascript - Chrome 和 Firefox 中的 SVG 文本对齐不一致 - 2

    我正在Leaflet.jsmap上绘制SVG标记图标。图标代表气象站,它们根据风向旋转,并以叠加层的形式显示平均风速。我已经能够让它在Chrome中按预期工作,但文本位置在Firefox中关闭。左边是Chrome(55.0.2883.95),右边是Firefox(50.0.1)。这是我正在使用的自定义Leaflet.Icon类:window.RemoteWind=window.RemoteWind||{};//ThisusesChroma.jstobuildacolorscalewhichisusedforwindspeed.//http://gka.github.io/chroma.

  7. javascript - 如何在打印时对齐文本 - 2

    我有一个只有一行的HTML表格,当用户从中选择任何元素时,第一列会自动完成。我正在填充相应的字段,因此在填充所有数据后,我试图在用户点击print时将表格的某些列数据对齐。我正在使用@mediaprint但它什么也没做Pleasecheckoutthisfiddleconsole.clear()constdata=[//datatopopulateItemNamesearchinputfield{"ItemName":"Butter"},{"ItemName":"Rice"},{"ItemName":"Milk"},{"ItemName":"IceCream"},{"ItemName"

  8. javascript - 证明行中图像的对齐方式(ala Google Images) - 2

    我想在固定宽度上调整图像(Google图像正是这样做的,例如:here)有什么简单的解决方案吗?最后的办法是编写一个jquery脚本,计算它可以放入一行中的图像数量,并逐个迭代图像。对于可以使用text-align:justify...文本完成的事情来说似乎有点矫枉过正...... 最佳答案 使用显示:内联block;对于带有图像和文本的元素对齐:对齐;对于父元素。示例:...和CSS:.images{text-align:justify;}.imagesli{display:inline-block;}

  9. javascript - 通过 JS 插入时,具有内联 block 和文本对齐的 DOM 等距 div 将不起作用 - 2

    我一直在尝试实现ChrisCoyier的内联block+文本对齐解决方案,以在给定的包装宽度中自动水平分布div。http://css-tricks.com/equidistant-objects-with-css/当元素立即加载到DOM中时效果很好,但由于某种原因在通过JS以编程方式添加元素时失败。就好像浏览器只是忽略了css属性。查看此fiddle以获得一个非常基本的示例:http://jsfiddle.net/xmajox/NUJnZ/前两行是在HTML加载时添加的。单击该按钮可通过JS在运行时添加更多内容。最初我认为它可能与伪元素的使用有某种关系:after所以我尝试了一个带有

  10. javascript - 将 WMD 编辑器的预览 HTML 与服务器端 HTML 验证对齐(例如,没有嵌入的 JavaScript 代码) - 2

    关于如何对WMD编辑器生成的Markdown进行服务器端清理以确保生成的HTML不包含恶意脚本,如下所示:但我也没有找到堵住客户端漏洞的好方法。当然,客户端验证不能替代服务器上的清理验证,因为任何人都可以假装是客户端并向您发送令人讨厌的Markdown。而且,如果您在服务器上删除HTML,攻击者将无法保存错误的HTML,这样其他人以后就无法看到它,并且他们的cookie被盗或session被错误的脚本劫持。因此,有一个有效的案例表明,在WMD预览Pane中执行无脚本规则可能也不值得。但想象一下,攻击者找到了一种将恶意Markdown放到服务器上的方法(例如,来自另一个站点的受损提要,或

随机推荐