有matplotlib散点图matrix的函数吗?

散点图matrix的例子

在这里输入图像说明

matplotlib.pyplot中有这样一个函数吗?

一般来说,matplotlib通常不包含对多个轴对象(在本例中为子图)进行操作的绘图function。 期望的是,你会写一个简单的函数,把你想要的东西串在一起。

我不太清楚你的数据是什么样的,但是从头开始构build一个函数是很简单的。 如果你总是要使用结构化或recarrays,那么你可以简化这个接触。 (即每个数据序列总是有一个名字,所以你可以不必指定名字。)

举个例子:

import itertools import numpy as np import matplotlib.pyplot as plt def main(): np.random.seed(1977) numvars, numdata = 4, 10 data = 10 * np.random.random((numvars, numdata)) fig = scatterplot_matrix(data, ['mpg', 'disp', 'drat', 'wt'], linestyle='none', marker='o', color='black', mfc='none') fig.suptitle('Simple Scatterplot Matrix') plt.show() def scatterplot_matrix(data, names, **kwargs): """Plots a scatterplot matrix of subplots. Each row of "data" is plotted against other rows, resulting in a nrows by nrows grid of subplots with the diagonal subplots labeled with "names". Additional keyword arguments are passed on to matplotlib's "plot" command. Returns the matplotlib figure object containg the subplot grid.""" numvars, numdata = data.shape fig, axes = plt.subplots(nrows=numvars, ncols=numvars, figsize=(8,8)) fig.subplots_adjust(hspace=0.05, wspace=0.05) for ax in axes.flat: # Hide all ticks and labels ax.xaxis.set_visible(False) ax.yaxis.set_visible(False) # Set up ticks only on one side for the "edge" subplots... if ax.is_first_col(): ax.yaxis.set_ticks_position('left') if ax.is_last_col(): ax.yaxis.set_ticks_position('right') if ax.is_first_row(): ax.xaxis.set_ticks_position('top') if ax.is_last_row(): ax.xaxis.set_ticks_position('bottom') # Plot the data. for i, j in zip(*np.triu_indices_from(axes, k=1)): for x, y in [(i,j), (j,i)]: axes[x,y].plot(data[x], data[y], **kwargs) # Label the diagonal subplots... for i, label in enumerate(names): axes[i,i].annotate(label, (0.5, 0.5), xycoords='axes fraction', ha='center', va='center') # Turn on the proper x or y axes ticks. for i, j in zip(range(numvars), itertools.cycle((-1, 0))): axes[j,i].xaxis.set_visible(True) axes[i,j].yaxis.set_visible(True) return fig main() 

在这里输入图像说明

对于那些不想定义自己的函数的人来说,Python中有一个很好的数据分析库,名为Pandas ,在这里可以findscatter_matrix()方法:

 from pandas.tools.plotting import scatter_matrix df = DataFrame(randn(1000, 4), columns=['a', 'b', 'c', 'd']) scatter_matrix(df, alpha=0.2, figsize=(6, 6), diagonal='kde') 

在这里输入图像说明

感谢您分享您的代码! 你找出了我们所有的困难。 当我正在使用它的时候,我注意到了一些看起来不太正确的小东西。

  1. [FIX#1]轴抽搐没有像我所期望的那样排列起来(例如,在上例中,您应该能够通过所有地块上的任意点绘制垂直和水平线,线应该穿过相应的指向其他情节,但是现在它不会发生。

  2. [FIX#2]如果你有一个奇数的variables你正在绘制,右下angular的轴不会拉动正确的XTX或YORY。 它只是将其作为默认的0..1滴答。

  3. 不是一个修复,但是我明确地input了names ,所以它把variablesi的默认xi放在对angular位置上。

下面你会发现你的代码的更新版本,以解决这两点,否则保持你的代码的美丽。

 import itertools import numpy as np import matplotlib.pyplot as plt def scatterplot_matrix(data, names=[], **kwargs): """ Plots a scatterplot matrix of subplots. Each row of "data" is plotted against other rows, resulting in a nrows by nrows grid of subplots with the diagonal subplots labeled with "names". Additional keyword arguments are passed on to matplotlib's "plot" command. Returns the matplotlib figure object containg the subplot grid. """ numvars, numdata = data.shape fig, axes = plt.subplots(nrows=numvars, ncols=numvars, figsize=(8,8)) fig.subplots_adjust(hspace=0.0, wspace=0.0) for ax in axes.flat: # Hide all ticks and labels ax.xaxis.set_visible(False) ax.yaxis.set_visible(False) # Set up ticks only on one side for the "edge" subplots... if ax.is_first_col(): ax.yaxis.set_ticks_position('left') if ax.is_last_col(): ax.yaxis.set_ticks_position('right') if ax.is_first_row(): ax.xaxis.set_ticks_position('top') if ax.is_last_row(): ax.xaxis.set_ticks_position('bottom') # Plot the data. for i, j in zip(*np.triu_indices_from(axes, k=1)): for x, y in [(i,j), (j,i)]: # FIX #1: this needed to be changed from ...(data[x], data[y],...) axes[x,y].plot(data[y], data[x], **kwargs) # Label the diagonal subplots... if not names: names = ['x'+str(i) for i in range(numvars)] for i, label in enumerate(names): axes[i,i].annotate(label, (0.5, 0.5), xycoords='axes fraction', ha='center', va='center') # Turn on the proper x or y axes ticks. for i, j in zip(range(numvars), itertools.cycle((-1, 0))): axes[j,i].xaxis.set_visible(True) axes[i,j].yaxis.set_visible(True) # FIX #2: if numvars is odd, the bottom right corner plot doesn't have the # correct axes limits, so we pull them from other axes if numvars%2: xlimits = axes[0,-1].get_xlim() ylimits = axes[-1,0].get_ylim() axes[-1,-1].set_xlim(xlimits) axes[-1,-1].set_ylim(ylimits) return fig if __name__=='__main__': np.random.seed(1977) numvars, numdata = 4, 10 data = 10 * np.random.random((numvars, numdata)) fig = scatterplot_matrix(data, ['mpg', 'disp', 'drat', 'wt'], linestyle='none', marker='o', color='black', mfc='none') fig.suptitle('Simple Scatterplot Matrix') plt.show() 

再次感谢与我们分享这个。 我用过很多次了! 哦,我重新安排了代码的main()部分,以便它可以是一个正式的示例代码,或者如果它被导入到另一段代码中,则不会被调用。

你也可以使用Seaborn的pairplot函数 :

 import seaborn as sns sns.set() df = sns.load_dataset("iris") sns.pairplot(df, hue="species") 

在阅读这个问题的时候,我期望看到一个包括rpy的答案。 我认为这是一个很好的select,利用两种美丽的语言。 所以这里是:

 import rpy import numpy as np def main(): np.random.seed(1977) numvars, numdata = 4, 10 data = 10 * np.random.random((numvars, numdata)) mpg = data[0,:] disp = data[1,:] drat = data[2,:] wt = data[3,:] rpy.set_default_mode(rpy.NO_CONVERSION) R_data = rpy.r.data_frame(mpg=mpg,disp=disp,drat=drat,wt=wt) # Figure saved as eps rpy.r.postscript('pairsPlot.eps') rpy.r.pairs(R_data, main="Simple Scatterplot Matrix Via RPy") rpy.r.dev_off() # Figure saved as png rpy.r.png('pairsPlot.png') rpy.r.pairs(R_data, main="Simple Scatterplot Matrix Via RPy") rpy.r.dev_off() rpy.set_default_mode(rpy.BASIC_CONVERSION) if __name__ == '__main__': main() 

我无法发布图片来显示结果:(对不起!