【问题标题】:Aligning two combined plots - Matplotlib对齐两个组合图 - Matplotlib
【发布时间】:2014-09-10 02:41:15
【问题描述】:

我目前正在一个绘图中显示数据组合。 我用以下代码绘制它们:

plt.figure()

# Data 1
data = plt.cm.binary(data1)
data[..., 3] = 1.0 * (data1 > 0.0)
fig = plt.imshow(data, interpolation='nearest', cmap='binary', vmin=0, vmax=1, extent=(-4, 4, -4, 4))

# Plotting just the nonzero values of data2
x = numpy.linspace(-4, 4, 11)
y = numpy.linspace(-4, 4, 11)
data2_x = numpy.nonzero(data2)[0]
data2_y = numpy.nonzero(data2)[1]

pts = plt.scatter(x[data2_x], y[data2_y], marker='s', c=data2[data2_x, data2_y])

这给了我这个情节:

从图片中可以看出,我的背景和前景方块没有对齐。

两者都具有相同的尺寸 (20 x 20)。如果可能的话,我希望有一种方法可以将中心与中心对齐,或者将角与角对齐,但要进行某种对齐。

在某些网格单元格中,我似乎有右下角对齐,在其他的左下角对齐中,而在另一些中则根本没有对齐,这会降低可视化效果。

任何帮助将不胜感激。

谢谢。

【问题讨论】:

  • 你想要extent kwarg on imshow
  • 我也不相信该代码会生成该数字。
  • 首先,让你的背景与你的数据颜色相同是一个糟糕的想法,我将它作为一个统一的背景在你的数据中 - 顶部的白色网格线。如果你说的是真的,灰色是坐标轴补丁颜色,那么你正在使用一些带有 alpha 的精美颜色图。其次,默认情况下imshow 的范围应为 0-> 图像大小。你在
  • 是的,这里很难取悦别人。以前,我总是发布我的完整代码,我只是听到人们说“简化它......”,就像他们根本不想阅读一样。当我们试图简化时,人们也会抱怨。很难。
  • 你没有简化你的代码,你只是发布了与你的身材无关的代码。如果您要简化代码,请发布该代码的输出图像。

标签: python matplotlib alignment scatter-plot imshow


【解决方案1】:

正如tcaswell 所说,通过为imshow 定义extent 关键字,您的问题可能最容易解决。

如果您提供extent keyword,则最外层像素边缘将位于范围内。例如:

import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.add_subplot(111)
ax.imshow(np.random.random((8, 10)), extent=(2, 6, -1, 1), interpolation='nearest', aspect='auto')

现在很容易计算每个像素的中心。 X方向:

  • 像素间距为 (6-2) / 10 = 0.4 像素
  • 最左边像素的中心距左边缘半个像素,2 + .4/2 = 2.2

同样,Y 中心位于 -.875 + n * 0.25。

因此,通过调整 extent,您可以将像素中心放在任何您想要的位置。


20x20 数据示例:

import matplotlib.pyplot as plt
import numpy

# create the data to be shown with "scatter"
yvec, xvec = np.meshgrid(np.linspace(-4.75, 4.75, 20), np.linspace(-4.75, 4.75, 20))
sc_data = random.random((20,20))

# create the data to be shown with "imshow" (20 pixels)
im_data = random.random((20,20))

fig = plt.figure()
ax = fig.add_subplot(111)
ax.imshow(im_data, extent=[-5,5,-5,5], interpolation='nearest', cmap=plt.cm.gray)
ax.scatter(xvec, yvec, 100*sc_data)

请注意,scatter(如果您查看 xvec,所有像素相距 0.5 个单位)和 imshow(因为图像从 -5 拉伸)的像素间距离相同到 +5 并且有 20 个像素,这些像素相距 0.5 个单位)。

【讨论】:

  • 谢谢你,@Drv。但是,我不知道如何将 imshow 与散点图相关联,以使两个图均等居中。 :S
  • 嗯,现在我明白了。非常感谢。 (:
【解决方案2】:

这里是没有对齐问题的代码。

import matplotlib.pyplot as plt
import numpy

data1 = numpy.random.rand(10, 10)
data2 = numpy.random.rand(10, 10)
data2[data2 < 0.4] = 0.0

plt.figure()

# Plotting data1
fig = plt.imshow(data1, interpolation='nearest', cmap='binary', vmin=0.0, vmax=1.0)

# Plotting data2
data2_x = numpy.nonzero(data2)[0]
data2_y = numpy.nonzero(data2)[1]
pts = plt.scatter(data2_x, data2_y, marker='s', c=data2[data2_x, data2_y])

plt.show()

它给出了一个完美对齐的组合图:

因此,在您的代码中使用附加选项可能是组合图未对齐的原因。

【讨论】:

  • 奇怪有趣,我会仔细修改我的额外选项。
  • 嗨,@Baptiste。我必须向那些试图帮助我的人道歉。我试图简化我的代码,但我省略了两个重要的行。我现在编辑了我的代码。现在,用我的代码运行你的数据,我得到了我在这里展示的行为。
  • 仔细观察你的地块,我注意到寮屋地块的“第一个”方格在(-4.0, -4.0),而“最后一个”方格在(4.0, 4.0)。这是你的问题。将其更改为(-3.9, -3.9)(3.9, 3.9) 以获得与我相同的图(或(-4.0, -4.0)(3.8, 3.8) 左下对齐)。为此,请更改 numpy.linspace 调用中的值。
猜你喜欢
  • 2015-02-08
  • 2021-07-09
  • 2021-09-07
  • 2021-11-30
  • 1970-01-01
  • 2013-10-24
  • 2021-12-30
  • 2017-10-05
  • 1970-01-01
相关资源
最近更新 更多