The simple answer: you should use plt.clf() , which clears the shape, not the current axis. There is also a break in the insert loop, which means that none of these codes will ever be executed.
When you start doing more complex things than using single axes, you should switch to using the OO interface on matplotlib . This may seem more complicated at first, but you no longer need to worry about the hidden state of pyplot . Your code can be rewritten as
fig = plt.figure() ax = fig.add_axes([.1,.1,.8,.8]) # main axes colors=['red','blue'] for key in Xpr: #Xpr holds my data #skipping over what I don't want to plot if not key[0] == '5': continue if key[1] == '0': continue if key[1] == 'a': continue x = Xpr[key] y = Ypr[key] #Ypr holds the Y axis and is created when Xpr is created ax.scatter(x,y,color=colors[count],marker='.',label=key) count += 1 ax.set_xlabel(r'$z/\mu$') ax.set_ylabel(r'$\rho(z)$') ax.set_xlim(0,10) leg = ax.legend() #Now I wish to create the inset ax_inset=fig.add_axes([0.7,0.7,0.3,0.3]) count =0 for key in Xpr: #Xpr holds my data if not key[0] == '5': continue if key[1] == '0': continue if key[1] == 'a': continue x = Xpr[key] y = Ypr[key] ax_inset.plot(x,y,color=colors[count],label=key) count +=1 ax_inset.legend()
source share