Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Matplotlib的绘图中不显示矩阵的某些值_Python_Matplotlib - Fatal编程技术网

Python Matplotlib的绘图中不显示矩阵的某些值

Python Matplotlib的绘图中不显示矩阵的某些值,python,matplotlib,Python,Matplotlib,我从CSV创建了一个空的参考矩阵,将(x,y)定位为矩阵上的一个位置(并将它们打印出来),然后将100指定为矩阵上的那个位置。每个x是ref_系列中的值 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)

我从CSV创建了一个空的参考矩阵,将(x,y)定位为矩阵上的一个位置(并将它们打印出来),然后将100指定为矩阵上的那个位置。每个x是ref_系列中的值

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):

情节:

绘图代码:

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()

最终图像中的每个像素表示3个或更多数据点。然后,渲染器必须决定将2倍蓝色、1倍白色中的哪种颜色映射到该像素。从统计上看,蓝色是白色的两倍,因此66%的数据点未显示

3个像素的数量来自粗略计算:图像有480个像素(可以在图片程序中找到,也可以通过计算figuresize*dpi找到)。您有1200个数据点(从轴上看)。两端的利润率约为10%;因此,在最终图像中,每像素大约有1200/(0.8*480)=3.1个数据点

imshow插值 您可以使用来显示这些像素,例如

plt.imshow(..., interpolation="sinc")
然而,结果在视觉上可能不是很吸引人

更改分辨率 您还可以确保最终绘图每个数据点正好包含一个像素。例如,对于dpi为100的1200像素,您可以

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()

画线
您确定要
imshow
?@DavidG是的,这是colorbar所必需的。仅此而已。不必使用imshow绘图来获得色条。也可以为其他绘图创建颜色条,例如,对于像这样的稀疏绘图情况,我可以想象使用线条绘图,根据颜色贴图为线条着色,然后创建颜色条。非常感谢。请问我们如何知道一个像素中包含的数据点的数量?是否可以仅在y轴上进行插值?imshow插值适用于两个方向,但您可以在打印之前过滤数据。我添加了两个新的可能解决方案。
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()