2024-04-29 00:43:04 发布
网友
我正在尝试为熊猫.DataFrame. 我不希望这种情况直接出现在熊猫身上,但在matplotlib中似乎也没有任何内容。我到处找遍了,除了rootpy,没有在任何包里找到它。在我自己花时间写这篇文章之前,我想我应该问一下是否有一个小的包,里面包含了剖面直方图,也许它们的名字不同。在
如果您不知道我所说的“profile histogram”是什么意思,请看一下根实现。http://root.cern.ch/root/html/TProfile.html
使用seaborn。来自@MaxNoe的数据
import numpy as np import seaborn as sns # just some random numbers to get startet x = np.random.uniform(-2, 2, 10000) y = np.random.normal(x**2, np.abs(x) + 1) sns.regplot(x=x, y=y, x_bins=10, fit_reg=None)
你可以做得更多(误差带来自bootstrap,你可以改变y轴上的估计器,添加回归…)
您可以使用^{}轻松完成。在
import scipy.stats import numpy import matplotlib.pyplot as plt x = numpy.random.rand(10000) y = x + scipy.stats.norm(0, 0.2).rvs(10000) means_result = scipy.stats.binned_statistic(x, [y, y**2], bins=50, range=(0,1), statistic='mean') means, means2 = means_result.statistic standard_deviations = numpy.sqrt(means2 - means**2) bin_edges = means_result.bin_edges bin_centers = (bin_edges[:-1] + bin_edges[1:])/2. plt.errorbar(x=bin_centers, y=means, yerr=standard_deviations, linestyle='none', marker='.')
我自己为这个功能做了一个模块。在
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,ax): 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']) ax.errorbar(ProfileFrame['bincenters'], ProfileFrame['ymean'], yerr=ProfileFrame['yMeanError'], xerr=(xmax-xmin)/(2*nbins), fmt=None) return ax def Profile_Matrix(frame): #Much of this is stolen from https://github.com/pydata/pandas/blob/master/pandas/tools/plotting.py 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): common = (mask[a] & mask[b]).values nbins = 100 (xmin,xmax) = boundaries_list[i] ax = axes[i, j] Profile(df[a][common],df[b][common],nbins,xmin,xmax,ax) 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
使用seaborn。来自@MaxNoe的数据
你可以做得更多(误差带来自bootstrap,你可以改变y轴上的估计器,添加回归…)
您可以使用^{} 轻松完成。在
我自己为这个功能做了一个模块。在
相关问题 更多 >
编程相关推荐