我从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
绘图代码:
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()
答案 0 :(得分:2)
最终图像中的每个像素代表3个或更多数据点。然后,渲染器必须决定2次蓝色中的哪种颜色,1次白色以映射到该像素。从统计上来说,这将是白色的两倍,这样就不会显示66%的数据点。
3个像素的数量来自粗略计算:您的图像有480个像素(您可以在图片程序中找到或通过计算figureize * dpi)。您有1200个数据点(从轴上看)。你的两端都有10%左右的差距;所以你在最终图像中每个像素大约有1200 /(0.8 * 480)= 3.1个数据点。
您可以使用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()
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()