Matplotlib在图中没有出现某些矩阵值

时间:2017-04-25 08:22:56

标签: python matplotlib

我从CSV创建了一个空参考矩阵,将(x,y)定位为矩阵上的位置(并将其打印出来),并将其指定为100到矩阵上的该位置。每个x都是ref_mass pandas Series中的值。

ref_df = pd.read_csv(ref_file)
reference = np.zeros(shape=(1201,len(ref_df)))
ref_mass = ref_df["mass"]

for i, mass in enumerate(ref_mass):
  print ref_mass[i].astype(int) - 300, i # print (x,y)
  reference[(ref_mass[i].astype(int) - 300),i] = 100

每个(x,y)都正确打印出来。但是,某些(x,y)的图中没有值。这有什么不对?我检查了参考矩阵,它在每一列中都有100个。

(x,y):

547 0
265 1
124 2
39 3
509 4 # shown
240 5 # shown
105 6
24 7
355 8
137 9
28 10 # shown
394 11
163 12
48 13
347 14
132 15 # shown
24 16

情节: enter image description here

绘图代码:

if __name__ == '__main__':
  from mpl_toolkits.mplot3d import Axes3D
  import matplotlib.pyplot as plt
  import matplotlib
  matplotlib.matplotlib_fname()

  plt.ylabel('m/z')
  plt.xlabel('Peptides')

  plt.imshow(reference, aspect='auto', cmap='terrain')
  plt.colorbar()
  plt.tight_layout()

  plt.show()

1 个答案:

答案 0 :(得分:2)

最终图像中的每个像素代表3个或更多数据点。然后,渲染器必须决定2次蓝色中的哪种颜色,1次白色以映射到该像素。从统计上来说,这将是白色的两倍,这样就不会显示66%的数据点。

3个像素的数量来自粗略计算:您的图像有480个像素(您可以在图片程序中找到或通过计算figureize * dpi)。您有1200个数据点(从轴上看)。你的两端都有10%左右的差距;所以你在最终图像中每个像素大约有1200 /(0.8 * 480)= 3.1个数据点。

imshow interpolation

您可以使用interpolation on the image来显示这些像素,例如

plt.imshow(..., interpolation="sinc")

但结果可能在视觉上不太吸引人。

更改分辨率

您还可以确保最终的绘图每个数据点只包含一个像素。即对于1200像素,dpi为100,你可以做到

m = 0.1
plt.figure(figsize=(8, (1+2.*m)*1200./dpi ))
plt.subplots_adjust(bottom=m, top=1.-m)
plt.imshow(...)

过滤数据

另一种选择是更改数据,使得一个像素沿y方向变为三个像素。

import matplotlib.pyplot as plt
import numpy as np; np.random.seed(1)
import scipy.ndimage.filters as filters

a = np.zeros((1200, 16))
for i in range(16):
    a[i*70+21, i] = 1

kernel = np.array([[0.,1.,0.],
                   [0.,1.,0.],
                   [0.,1.,0.]])
anew = filters.convolve(a,kernel,mode='constant', cval=0)

im = plt.imshow(anew, aspect="auto")
plt.colorbar(im)

plt.show()

enter image description here

画线

import matplotlib.pyplot as plt
import numpy as np

a = np.zeros((1200, 16))

im = plt.imshow(a, aspect="auto", vmin=0, vmax=1)
plt.colorbar(im)

for i in range(16):
    plt.plot([i-.5, i+.5], [i*70+21,i*70+21], color=im.cmap(1.))

plt.show()