我应该如何通过函数传递matplotlib对象;作为轴,轴或图?
发布时间:2020-12-20 12:06:29 所属栏目:Python 来源:网络整理
导读:提前抱歉,如果这是一个有点长的啰嗦,但如果我把它减少太多,问题就会丢失.我正在尝试在pandas和matplotlib之上创建一个模块,这将使我能够创建类似于scatter_matrix的配置文件图和配置文件矩阵.我很确定我的问题归结为我需要从Profile()返回什么对象,以便我可
提前抱歉,如果这是一个有点长的啰嗦,但如果我把它减少太多,问题就会丢失.我正在尝试在pandas和matplotlib之上创建一个模块,这将使我能够创建类似于scatter_matrix的配置文件图和配置文件矩阵.我很确定我的问题归结为我需要从Profile()返回什么对象,以便我可以处理Profile_Matrix()中的Axes操作.然后问题是什么返回形式Profile_Matrix()所以我可以编辑子图.
我的模块(ProfileModule.py)从https://github.com/pydata/pandas/blob/master/pandas/tools/plotting.py借了很多,看起来像: import pandas as pd from pandas import Series,DataFrame import numpy as np import matplotlib.pyplot as plt def Profile(x,y,nbins,xmin,xmax): df = DataFrame({'x' : x,'y' : y}) binedges = xmin + ((xmax-xmin)/nbins) * np.arange(nbins+1) df['bin'] = np.digitize(df['x'],binedges) bincenters = xmin + ((xmax-xmin)/nbins)*np.arange(nbins) + ((xmax-xmin)/(2*nbins)) ProfileFrame = DataFrame({'bincenters' : bincenters,'N' : df['bin'].value_counts(sort=False)},index=range(1,nbins+1)) bins = ProfileFrame.index.values for bin in bins: ProfileFrame.ix[bin,'ymean'] = df.ix[df['bin']==bin,'y'].mean() ProfileFrame.ix[bin,'yStandDev'] = df.ix[df['bin']==bin,'y'].std() ProfileFrame.ix[bin,'yMeanError'] = ProfileFrame.ix[bin,'yStandDev'] / np.sqrt(ProfileFrame.ix[bin,'N']) fig = plt.figure(); ax = ProfilePlot.add_subplot(1,1,1) plt.errorbar(ProfileFrame['bincenters'],ProfileFrame['ymean'],yerr=ProfileFrame['yMeanError'],xerr=(xmax-xmin)/(2*nbins),fmt=None) return ax #or should I "return fig" def Profile_Matrix(frame): import pandas.core.common as com import pandas.tools.plotting as plots from pandas.compat import lrange from matplotlib.artist import setp range_padding=0.05 df = frame._get_numeric_data() n = df.columns.size fig,axes = plots._subplots(nrows=n,ncols=n,squeeze=False) # no gaps between subplots fig.subplots_adjust(wspace=0,hspace=0) mask = com.notnull(df) boundaries_list = [] for a in df.columns: values = df[a].values[mask[a].values] rmin_,rmax_ = np.min(values),np.max(values) rdelta_ext = (rmax_ - rmin_) * range_padding / 2. boundaries_list.append((rmin_ - rdelta_ext,rmax_+ rdelta_ext)) for i,a in zip(lrange(n),df.columns): for j,b in zip(lrange(n),df.columns): ax = axes[i,j] common = (mask[a] & mask[b]).values nbins = 100 (xmin,xmax) = boundaries_list[i] ax=Profile(df[b][common],df[a][common],xmax) #Profile(df[b][common].values,df[a][common].values,xmax) ax.set_xlabel('') ax.set_ylabel('') plots._label_axis(ax,kind='x',label=b,position='bottom',rotate=True) plots._label_axis(ax,kind='y',label=a,position='left') if j!= 0: ax.yaxis.set_visible(False) if i != n-1: ax.xaxis.set_visible(False) for ax in axes.flat: setp(ax.get_xticklabels(),fontsize=8) setp(ax.get_yticklabels(),fontsize=8) return axes 这将运行如下: import pandas as pd from pandas import Series,DataFrame import numpy as np import matplotlib.pyplot as plt import ProfileModule as pm x = np.random.uniform(0,100,size=1000) y = x *x + 50*x*np.random.randn(1000) z = x *y + 50*y*np.random.randn(1000) nbins = 25 xmax = 100 xmin = 0 ProfilePlot = pm.Profile(x,xmax) plt.title("Look this works!") #This does not work as expected frame = DataFrame({'z' : z,'x' : x,'y' : y}) ProfileMatrix = pm.Profile_Matrix(frame) plt.show() 这有望产生一个简单的轮廓图和3×3轮廓矩阵,但事实并非如此.我已经尝试了各种不同的方法来实现这一点,但我认为不值得解释它们. 我应该提到我在Windows 7上使用Enthought Canopy Express.很抱歉这篇文章很长,并再次感谢您对代码的任何帮助.这是我使用Python的第一周. 解决方法
您应该传递Axes对象并将函数分解为一次在单个轴上操作.你很亲密,但只是改变
import numpy as np import matplotlib.pyplot as plt def _profile(ax,x,y): ln,= ax.plot(x,y) # return the Artist created return ln def profile_matrix(n,m): fig,ax_array = plt.subplots(n,m,sharex=True,sharey=True) for ax in np.ravel(ax_array): _profile(ax,np.arange(50),np.random.rand(50)) profile_matrix(3,3) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |