Python - 为什么 matplotlib 散点图的点坐标为负,坐标为正?
Python - Why scatter of matplotlib plots points which have negative coordinates, with positive coordinates?
所以我的脚本有一个大问题:我用 numpy 做了一个数组,其中包含一些点的 x、y 和 z 坐标。其中一些点具有负坐标(对于 x and/or y and/or z)。由于我不明白的原因,当我使用 matplotlib 中的函数 scatter 时,它会绘制所有具有正坐标的点(这意味着如果坐标为负,它将被绘制为正...):
所以我的问题很简单:为什么要这样做,以及如何正确绘制具有负坐标的点?
这是我的代码,分为两部分:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import Tkinter
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
import numpy as np
import os
import subprocess
import Parse_Gro
class windowsTk(Tkinter.Tk):
def __init__(self,parent):
Tkinter.Tk.__init__(self,parent)
self.parent = parent
self.f = Figure(figsize=(6, 6), dpi=100)
self.canevas = FigureCanvasTkAgg(self.f, master=self)
self.subplota= self.f.add_subplot(111)
self.RotateMatY= np.matrix([[np.cos(0.2*np.pi),0,np.sin(0.2*np.pi)],[0,1,0],[-np.sin(0.2*np.pi),0,np.cos(0.2*np.pi)]])
self.RotateMatZ= np.matrix([[np.cos(0.2*np.pi),-np.sin(0.2*np.pi),0],[np.sin(0.2*np.pi),np.cos(0.2*np.pi),0],[0,0,1]])
self.matrice=Parse_Gro.get_Coordinates()
self.initialize()
def initialize(self):
self.grid()
self.canevas.get_tk_widget().grid(column=0,row=0,columnspan=3)
button1 = Tkinter.Button(self,text=u"Rotate Right",command=self.ClickonRight)
button1.grid(column=2,row=2)
button2 = Tkinter.Button(self,text=u"Rotate Left",command=self.ClickonLeft)
button2.grid(column=0,row=2)
button3 = Tkinter.Button(self,text=u"Rotate Up",command=self.ClickonUp)
button3.grid(column=1,row=1)
button4 = Tkinter.Button(self,text=u"Rotate Down",command=self.ClickonDown)
button4.grid(column=1,row=3)
#Sort according to X coordinate (first column)
#self.matrice=np.sort(self.matrice, axis=0)
#Scatter Plot Test
self.subplota.scatter(self.matrice[:,1],self.matrice[:,2],c=self.matrice[:,0],s=self.matrice[:,0]*100)
def ClickonRight(self):
print"Right Rotation"
def ClickonLeft(self):
print"Left Rotation"
def ClickonUp(self):
print"Up Rotation"
def ClickonDown(self):
print"Down Rotation"
if __name__ == "__main__":
app = windowsTk(None)
app.title('Visualisation 3D Proteine')
app.mainloop()
这是另一个file.py
中代码的第二部分:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import subprocess
import numpy as np
def get_Coordinates():
path = raw_input("Enter a Path to your PDB file: ")
#Path Example :/home/yoann
os.chdir(path)
filename = raw_input("Enter the name of your PDB file: ")
#Filename Example : 5f4c.pdb
bashCommand = "gmx editconf -f {:s} -o output.gro -center 0 0 0 -aligncenter 0 0 0".format(filename)
process = subprocess.Popen(bashCommand.split(), stdout=subprocess.PIPE)
output = process.communicate()[0]
ListX=[]
ListY=[]
ListZ=[]
with open("/home/yoann/output.gro","r") as file:
lines = file.readlines()
for line in lines[2:-1:]:
ListX.append(float(line[22:28]))
ListY.append(float(line[30:36]))
ListZ.append(float(line[38:44]))
matrixCoord=np.column_stack([ListX,ListY,ListZ])
return matrixCoord
这里我用函数 get_Coordinate() 把 File 的内容举个例子 red :
PUTATIVE CYTOPLASMIC PROTEIN
1637
1MET N 1 1.206 1.701 1.641
1MET CA 2 1.077 1.663 1.575
2ASN C 11 0.687 1.503 1.675
2ASN O 12 0.688 1.495 1.550
这里我把应该显示的程序放在这里:
干杯!
我将您的问题解读为:
Why do the circles at negative coordinates on the axis into and out of the page look the same as their absolute value
我认为你的问题出在这一行:
self.subplota.scatter(
self.matrice[:,1],
self.matrice[:,2],
c=self.matrice[:,0],
s=self.matrice[:,0]*100
)
请记住,s
是以像素为单位的 大小。它不是任何类型的 3D 支持。半径为 -100
的圆看起来与半径为 100
的圆非常相似。您应该找到数据的最小值和最大值,然后根据它们选择圆圈大小。
您是否考虑过使用 mplot3d
,并且只使用预建的 3d 图 window?
抱歉,在我发布此消息后,我再次尝试 运行 我的脚本,但由于某些原因,我仍然无法正常工作!我在消息开头的捕获是好的捕获。我想这可能是在 python 中重新加载新数据的问题,也许我应该重新启动会话以使这些事情正确...
所以,如果有人遇到同样的问题,我建议重新启动您的 python 会话(也可能重新启动您的计算机)。这就是我所做的,它对我有用。
这里的脚本可以免费使用,请保持友善,并在您的自述文件或您的资源中添加一点注释,说明它们来自我 (Yoann PAGEAUD) ;) !
谢谢你们!干杯!
所以我的脚本有一个大问题:我用 numpy 做了一个数组,其中包含一些点的 x、y 和 z 坐标。其中一些点具有负坐标(对于 x and/or y and/or z)。由于我不明白的原因,当我使用 matplotlib 中的函数 scatter 时,它会绘制所有具有正坐标的点(这意味着如果坐标为负,它将被绘制为正...):
所以我的问题很简单:为什么要这样做,以及如何正确绘制具有负坐标的点?
这是我的代码,分为两部分:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import Tkinter
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
import numpy as np
import os
import subprocess
import Parse_Gro
class windowsTk(Tkinter.Tk):
def __init__(self,parent):
Tkinter.Tk.__init__(self,parent)
self.parent = parent
self.f = Figure(figsize=(6, 6), dpi=100)
self.canevas = FigureCanvasTkAgg(self.f, master=self)
self.subplota= self.f.add_subplot(111)
self.RotateMatY= np.matrix([[np.cos(0.2*np.pi),0,np.sin(0.2*np.pi)],[0,1,0],[-np.sin(0.2*np.pi),0,np.cos(0.2*np.pi)]])
self.RotateMatZ= np.matrix([[np.cos(0.2*np.pi),-np.sin(0.2*np.pi),0],[np.sin(0.2*np.pi),np.cos(0.2*np.pi),0],[0,0,1]])
self.matrice=Parse_Gro.get_Coordinates()
self.initialize()
def initialize(self):
self.grid()
self.canevas.get_tk_widget().grid(column=0,row=0,columnspan=3)
button1 = Tkinter.Button(self,text=u"Rotate Right",command=self.ClickonRight)
button1.grid(column=2,row=2)
button2 = Tkinter.Button(self,text=u"Rotate Left",command=self.ClickonLeft)
button2.grid(column=0,row=2)
button3 = Tkinter.Button(self,text=u"Rotate Up",command=self.ClickonUp)
button3.grid(column=1,row=1)
button4 = Tkinter.Button(self,text=u"Rotate Down",command=self.ClickonDown)
button4.grid(column=1,row=3)
#Sort according to X coordinate (first column)
#self.matrice=np.sort(self.matrice, axis=0)
#Scatter Plot Test
self.subplota.scatter(self.matrice[:,1],self.matrice[:,2],c=self.matrice[:,0],s=self.matrice[:,0]*100)
def ClickonRight(self):
print"Right Rotation"
def ClickonLeft(self):
print"Left Rotation"
def ClickonUp(self):
print"Up Rotation"
def ClickonDown(self):
print"Down Rotation"
if __name__ == "__main__":
app = windowsTk(None)
app.title('Visualisation 3D Proteine')
app.mainloop()
这是另一个file.py
中代码的第二部分:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import subprocess
import numpy as np
def get_Coordinates():
path = raw_input("Enter a Path to your PDB file: ")
#Path Example :/home/yoann
os.chdir(path)
filename = raw_input("Enter the name of your PDB file: ")
#Filename Example : 5f4c.pdb
bashCommand = "gmx editconf -f {:s} -o output.gro -center 0 0 0 -aligncenter 0 0 0".format(filename)
process = subprocess.Popen(bashCommand.split(), stdout=subprocess.PIPE)
output = process.communicate()[0]
ListX=[]
ListY=[]
ListZ=[]
with open("/home/yoann/output.gro","r") as file:
lines = file.readlines()
for line in lines[2:-1:]:
ListX.append(float(line[22:28]))
ListY.append(float(line[30:36]))
ListZ.append(float(line[38:44]))
matrixCoord=np.column_stack([ListX,ListY,ListZ])
return matrixCoord
这里我用函数 get_Coordinate() 把 File 的内容举个例子 red :
PUTATIVE CYTOPLASMIC PROTEIN
1637
1MET N 1 1.206 1.701 1.641
1MET CA 2 1.077 1.663 1.575
2ASN C 11 0.687 1.503 1.675
2ASN O 12 0.688 1.495 1.550
这里我把应该显示的程序放在这里:
干杯!
我将您的问题解读为:
Why do the circles at negative coordinates on the axis into and out of the page look the same as their absolute value
我认为你的问题出在这一行:
self.subplota.scatter(
self.matrice[:,1],
self.matrice[:,2],
c=self.matrice[:,0],
s=self.matrice[:,0]*100
)
请记住,s
是以像素为单位的 大小。它不是任何类型的 3D 支持。半径为 -100
的圆看起来与半径为 100
的圆非常相似。您应该找到数据的最小值和最大值,然后根据它们选择圆圈大小。
您是否考虑过使用 mplot3d
,并且只使用预建的 3d 图 window?
抱歉,在我发布此消息后,我再次尝试 运行 我的脚本,但由于某些原因,我仍然无法正常工作!我在消息开头的捕获是好的捕获。我想这可能是在 python 中重新加载新数据的问题,也许我应该重新启动会话以使这些事情正确... 所以,如果有人遇到同样的问题,我建议重新启动您的 python 会话(也可能重新启动您的计算机)。这就是我所做的,它对我有用。 这里的脚本可以免费使用,请保持友善,并在您的自述文件或您的资源中添加一点注释,说明它们来自我 (Yoann PAGEAUD) ;) ! 谢谢你们!干杯!