使用子图时的plt.plot

0 投票
1 回答
921 浏览
提问于 2025-04-18 05:58

我有一段用matplotlib写的代码,目的是创建三个共享同一坐标轴的子图。我的问题是,我想在每个子图上画一个椭圆,但椭圆只在其中一个子图上显示。有人能告诉我我哪里出错了吗?

抱歉如果这个问题在别的地方已经有人回答过,我找了很久但还是找不到答案!

from pylab import *
import numpy as np
import sys 
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import scipy.interpolate
import matplotlib
from matplotlib.patches import Ellipse
from numpy import linspace
from scipy import pi,sin,cos

data = np.genfromtxt(sys.argv[1]);
name1 = (sys.argv[1]);
name = ( sys.argv[2] );
print(sys.argv)

font = {'family' : 'normal',
    'size'   : 16}

matplotlib.rc('font', **font)



def ellipse(ra,rb,ang,x0,y0,Nb=50):
xpos,ypos=x0,y0
radm,radn=ra,rb
an=ang

co,si=cos(an),sin(an)
the=linspace(0,2*pi,Nb)
X=radm*cos(the)*co-si*radn*sin(the)+xpos
Y=radm*cos(the)*si+co*radn*sin(the)+ypos
return X,Y

def plot(x, y, z, name1, name):

#    I2 = scipy.interpolate.NearestNDInterpolator((x, y), z)
  I2 = scipy.interpolate.Rbf(x, y, z, function='linear')


 xi, yi = np.linspace(x.min(), x.max(), 100), np.linspace(y.min(), y.max(), 100)
 xig, yig = np.meshgrid(xi, yi)
 zi     = I2(xig, yig)
 plt.clf()

#creating plot

 f, axarr = plt.subplots(1,3,sharey=True)
 plt.setp(axarr.flat, aspect=1.0, adjustable='box-forced')

#first plot

  im1=axarr[2].imshow(zi, vmin=0, vmax=1,cmap='gist_heat_r', origin='lower', extent=[x.min(), x.max(), y.min(), y.max()])
#    axarr[2].set_title('Sharing both axes')
  X,Y=ellipse(7.36,2.29,0,0,0,Nb=70)
  plt.plot(X,Y,"g.-",ms=1) # green ellipse

#second plot
  im2=axarr[1].imshow(zi, vmin=0, vmax=1,cmap='gist_heat_r', origin='lower', extent=[x.min(), x.max(), y.min(), y.max()])
  X,Y=ellipse(7.36,2.29,0,0,0,Nb=70)
  plt.plot(X,Y,"g.-",ms=1) # green ellipse

#third plot    
 im3=axarr[0].imshow(zi, vmin=0, vmax=1,cmap='gist_heat_r', origin='lower', extent=[x.min(), x.max(), y.min(), y.max()])

# axis labels
 plt.xlabel('X AXIS (kpc)')
 plt.ylabel('Y AXIS (kpc)')

 f.subplots_adjust(hspace=0);
 f.subplots_adjust(wspace=0);

 X,Y=ellipse(7.36,2.29,0,0,0,Nb=70)
 plt.plot(X,Y,"g.-",ms=1) # green ellipse

# Colorbar    
  from mpl_toolkits.axes_grid1 import make_axes_locatable
  divider = make_axes_locatable(plt.gca())
  cax = divider.append_axes("right", "5%", pad="3%")
  plt.colorbar(im1,cax=cax)

# Save figure
  plt.savefig(name1 + "_norm.eps", bbox_inches='tight');

  plot(data[:,0], data[:,1], data[:,2], name1, name);

1 个回答

0

当你调用 plt.plot() 时,你希望它在哪个坐标轴上绘图呢?它会在当前活动的坐标轴上绘图,而在你的情况下,可能是第一个坐标轴。

你需要在调用 plt.plot() 之前,使用 plt.sca(axarr[n]) 来改变当前活动的坐标轴,或者更好的方法是,不要混用面向对象和状态机的接口,直接使用 axarr[n].plot()

你在使用 .imshow() 的时候用了面向对象的接口,那为什么 .plot() 也不这样做呢?

撰写回答