对齐两个组合图 - Matplotlib
我现在在做一个图表,里面展示了组合的数据。
我用下面的代码来绘制它:
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)。我想找个办法,如果可能的话,能让它们中心对中心,或者角对角对齐,反正就是想要某种对齐方式。
在一些网格单元中,似乎是右下角对齐,在其他的则是左下角对齐,还有一些根本没有对齐,这样就影响了视觉效果。
希望能得到一些帮助。
谢谢。
2 个回答
1
这里有一段代码,没有对齐的问题。
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()
这段代码可以生成完美对齐的组合图:
所以,你代码中使用的额外选项可能是导致组合图没有对齐的原因。
2
正如tcaswell
所说,你的问题可以通过为imshow
定义extent
关键字来更容易地解决。
如果你设置了extent
关键字,最外层的像素边缘就会位于这些范围内。例如:
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 + 0.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单位)是相同的。