使matplotlibgraphics看起来像R默认?

有没有办法使matplotlib行为相同的R,或几乎像R,在绘图默认方面? 例如,R和matplotlib完全不同。 以下直方图 在这里输入图像说明

有“浮动轴”与外向蜱,这样就没有内部蜱(不像matplotlib )和轴不会越过“靠近”的原点。 另外,直方图可以“溢出”到未被勾号标记的值 – 例如,x轴在3处结束,但直方图稍微超出了它。 matplotlib所有直方图如何自动实现?

相关问题:散点图和线图在R中有不同的默认轴设置,例如: 在这里输入图像说明

没有内部的蜱再次和蜱向外面。 而且,在原点之后(y轴和x轴在轴的左下方交叉)稍微开始滴答,滴答在轴结束之前略微结束。 这样,最低x轴刻度和最低y轴刻度的标签不能真正交叉,因为它们之间有一个空间,这使得情节非常优雅干净的外观。 请注意,在蜱标签和蜱本身之间也有相当多的空间。

此外,默认情况下,未标记的x轴或y轴上没有刻度,表示左侧的y轴与右侧标记的y轴平行,没有刻度,x轴也是一样,再次从地块中消除混乱。

有没有办法让matplotlib看起来像这样? 一般来说,默认情况下,默认的R图是多less? 我非常喜欢matplotlib但是我认为R默认/开箱即可的绘图行为确实已经得到了正确的结果,而且它的默认设置很less会导致重叠的刻度标签,杂乱的或压扁的数据,所以我希望默认值是尽可能地多。

1年后编辑:

seaborn ,下面的例子变成:

 import numpy as np import matplotlib.pyplot as plt import seaborn seaborn.set(style='ticks') # Data to be represented X = np.random.randn(256) # Actual plotting fig = plt.figure(figsize=(8,6), dpi=72, facecolor="white") axes = plt.subplot(111) heights, positions, patches = axes.hist(X, color='white') seaborn.despine(ax=axes, offset=10, trim=True) fig.tight_layout() plt.show() 

相当容易。

原文:

这篇博文是迄今为止我见过的最好的。 http://messymind.net/making-matplotlib-look-like-ggplot/

它并不像您在大多数“入门”types的示例中看到的那样关注您的标准R图。 相反,它试图模仿ggplot2的风格,这似乎几乎被普遍认为是时尚和精心devise的。

为了让你的脊柱像你看到的酒吧情节,尝试按照这里的前几个例子之一: http : //www.loria.fr/~rougier/coding/gallery/

最后,为了让轴​​刻度指向外部,你可以编辑你的matplotlibrc文件来说xtick.direction : outytick.direction : out

将这些概念结合在一起,我们得到这样的东西:

 import numpy as np import matplotlib import matplotlib.pyplot as plt # Data to be represented X = np.random.randn(256) # Actual plotting fig = plt.figure(figsize=(8,6), dpi=72, facecolor="white") axes = plt.subplot(111) heights, positions, patches = axes.hist(X, color='white') axes.spines['right'].set_color('none') axes.spines['top'].set_color('none') axes.xaxis.set_ticks_position('bottom') # was: axes.spines['bottom'].set_position(('data',1.1*X.min())) axes.spines['bottom'].set_position(('axes', -0.05)) axes.yaxis.set_ticks_position('left') axes.spines['left'].set_position(('axes', -0.05)) axes.set_xlim([np.floor(positions.min()), np.ceil(positions.max())]) axes.set_ylim([0,70]) axes.xaxis.grid(False) axes.yaxis.grid(False) fig.tight_layout() plt.show() 

刺的位置可以通过多种方式指定。 如果在IPython中运行上面的代码,那么可以执行axes.spines['bottom'].set_position? 看到你所有的select。

Python中的R风格的条形图

嗯是的。 这不是微不足道的,但你可以靠近。

matplotlib> = 1.4 suports 风格 (和ggplot风格内置):

 In [1]: import matplotlib as mpl In [2]: import matplotlib.pyplot as plt In [3]: import numpy as np In [4]: mpl.style.available Out[4]: [u'dark_background', u'grayscale', u'ggplot'] In [5]: mpl.style.use('ggplot') In [6]: plt.hist(np.random.randn(100000)) Out[6]: ... 

在这里输入图像说明

######

编辑10/14/2013:有关信息,ggplot现在已经实现了python(build立在matplotlib)。

看到这个博客或直接进入该项目的github页面的更多信息和例子。

######

据我所知,在matplotlib中没有内置的解决scheme,直接给你的数字看起来比用R做的类似。

有些软件包,比如mpltools ,使用Matplotlib的rc参数增加了对样式表的支持,并且可以帮助你获得ggplot外观(例子见ggplot样式 )。

然而,因为所有的东西都可以在matplotlib中调整,所以直接开发自己的函数来实现你想要的东西可能会更容易。 作为一个例子,下面是一个片段,可以让你轻松地定制任何matplotlib图的轴。

 def customaxis(ax, c_left='k', c_bottom='k', c_right='none', c_top='none', lw=3, size=20, pad=8): for c_spine, spine in zip([c_left, c_bottom, c_right, c_top], ['left', 'bottom', 'right', 'top']): if c_spine != 'none': ax.spines[spine].set_color(c_spine) ax.spines[spine].set_linewidth(lw) else: ax.spines[spine].set_color('none') if (c_bottom == 'none') & (c_top == 'none'): # no bottom and no top ax.xaxis.set_ticks_position('none') elif (c_bottom != 'none') & (c_top != 'none'): # bottom and top ax.tick_params(axis='x', direction='out', width=lw, length=7, color=c_bottom, labelsize=size, pad=pad) elif (c_bottom != 'none') & (c_top == 'none'): # bottom but not top ax.xaxis.set_ticks_position('bottom') ax.tick_params(axis='x', direction='out', width=lw, length=7, color=c_bottom, labelsize=size, pad=pad) elif (c_bottom == 'none') & (c_top != 'none'): # no bottom but top ax.xaxis.set_ticks_position('top') ax.tick_params(axis='x', direction='out', width=lw, length=7, color=c_top, labelsize=size, pad=pad) if (c_left == 'none') & (c_right == 'none'): # no left and no right ax.yaxis.set_ticks_position('none') elif (c_left != 'none') & (c_right != 'none'): # left and right ax.tick_params(axis='y', direction='out', width=lw, length=7, color=c_left, labelsize=size, pad=pad) elif (c_left != 'none') & (c_right == 'none'): # left but not right ax.yaxis.set_ticks_position('left') ax.tick_params(axis='y', direction='out', width=lw, length=7, color=c_left, labelsize=size, pad=pad) elif (c_left == 'none') & (c_right != 'none'): # no left but right ax.yaxis.set_ticks_position('right') ax.tick_params(axis='y', direction='out', width=lw, length=7, color=c_right, labelsize=size, pad=pad) 

编辑:对于非接触刺,请参阅下面的函数诱导刺的10点位移(取自matplotlib网站上的这个例子 )。

 def adjust_spines(ax,spines): for loc, spine in ax.spines.items(): if loc in spines: spine.set_position(('outward',10)) # outward by 10 points spine.set_smart_bounds(True) else: spine.set_color('none') # don't draw spine 

例如,下面的代码和两个图显示了matplotib的默认输出(左边),以及调用函数的输出(右边):

 import numpy as np import matplotlib.pyplot as plt fig,(ax1,ax2) = plt.subplots(figsize=(8,5), ncols=2) ax1.plot(np.random.rand(20), np.random.rand(20), 'ok') ax2.plot(np.random.rand(20), np.random.rand(20), 'ok') customaxis(ax2) # remove top and right spines, ticks out adjust_spines(ax2, ['left', 'bottom']) # non touching spines plt.show() 

图片

当然,你需要花一些时间来确定matplotlib中的哪些参数需要调整,以使得你的图像看起来和R一样,但是我不确定现在还有其他选项。

我会检查一下Bokeh ,它的目的是“在R中提供一个引人注目的Python ggplot相当于Python”。 这里的例子

编辑:也看看Seaborn ,它试图重现ggplot2的视觉风格和语法。

以下是您可能有兴趣阅读的博客文章:

绘制pandasGSoC2012

http://pandasplotting.blogspot.com/

决定尝试实现一个ggplot2types绘图接口…还不知道有多lessggplot2function实现…

笔者分叉pandas,并build立了相当多的pandasggplot2风格的语法。

密度图

 plot = rplot.RPlot(tips_data, x='total_bill', y='tip') plot.add(rplot.TrellisGrid(['sex', 'smoker'])) plot.add(rplot.GeomHistogram()) plot.render(plt.gcf()) 

pandas叉在这里: https : //github.com/orbitfold/pandas

看起来像代码肉,使R影响的graphics在一个名为rplot.py文件可以在回购分支中find。

 class GeomScatter(Layer): """ An efficient scatter plot, use this instead of GeomPoint for speed. """ class GeomHistogram(Layer): """ An efficient histogram, use this instead of GeomBar for speed. """ 

链接到分支机构:

https://github.com/orbitfold/pandas/blob/rplot/pandas/tools/rplot.py

我以为这真的很酷,但我不知道这个项目是否得到维护。 最近一次提交是前一阵子。

在matplotlibrc中设置spine解释了为什么不可能简单地编辑Matplotlib默认值来生成R风格的直方图。 对于散点图, matplotlib中的R样式数据轴缓冲区和matplotlib中,如何绘制从轴向外的R型轴蜱? 显示一些可以改变的默认值,以提供更多的R-ish外观。 假设你已经用facecolor='none'在你的Axes实例上调用了hist() ,那么构build一些其他的答案,下面的函数可以模仿R的直方图风格。

 def Rify(axes): ''' Produce R-style Axes properties ''' xticks = axes.get_xticks() yticks = axes.get_yticks() #remove right and upper spines axes.spines['right'].set_color('none') axes.spines['top'].set_color('none') #make the background transparent axes.set_axis_bgcolor('none') #allow space between bottom and left spines and Axes axes.spines['bottom'].set_position(('axes', -0.05)) axes.spines['left'].set_position(('axes', -0.05)) #allow plot to extend beyond spines axes.spines['bottom'].set_bounds(xticks[0], xticks[-2]) axes.spines['left'].set_bounds(yticks[0], yticks[-2]) #set tick parameters to be more R-like axes.tick_params(direction='out', top=False, right=False, length=10, pad=12, width=1, labelsize='medium') #set x and y ticks to include all but the last tick axes.set_xticks(xticks[:-1]) axes.set_yticks(yticks[:-1]) return axes 

import matplotlib.pyplot as plt plt.style.use('ggplot')

在这里做一些情节,并享受它