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