60

matplotlibデフォルトのプロットに関して、R と同じように、またはほぼ R のように動作させる方法はありますか? たとえば、R はその軸を とはかなり異なる方法で扱いますmatplotlib。次のヒストグラム ここに画像の説明を入力

には、外側の目盛りを持つ「浮動軸」があり、( とは異なりmatplotlib) 内側の目盛りがなく、軸が原点の「近く」を横切らないようになっています。また、ヒストグラムは、目盛りでマークされていない値に「波及」する可能性があります。たとえば、x 軸は 3 で終了しますが、ヒストグラムはそれをわずかに超えています。のすべてのヒストグラムに対してこれをどのように自動的に達成できますmatplotlibか?

関連する質問: R では、散布図と折れ線グラフの既定の軸設定が異なります。たとえば、次のようになります。 ここに画像の説明を入力

再び内側の目盛りはなく、目盛りは外側を向いています。また、目盛りは原点 (y 軸と x 軸が軸の左下で交差する場所) の少し後に開始し、目盛りは軸が終了する少し前に終了します。このようにして、最小の x 軸の目盛りと最小の y 軸の目盛りのラベルが実際に交差することはありません。これは、それらの間にスペースがあり、これによりプロットが非常にエレガントでクリーンな外観になるためです。軸の目盛りラベルと目盛り自体の間にもかなり大きなスペースがあることに注意してください。

また、デフォルトでは、ラベルの付いていない x 軸または y 軸には目盛りがありません。つまり、右側のラベル付き y 軸に平行な左側の y 軸には目盛りがなく、x 軸についても同じです。再びプロットから混乱を取り除きます。

matplotlib をこのようにする方法はありますか? そして、一般的に、デフォルトでデフォルトの R プロットと同じくらい見えるようにするには? 私はとても気に入っmatplotlibていますが、R のデフォルト / すぐに使えるプロットの動作は本当にうまくいっていると思います。そのデフォルト設定はめったに目盛りラベルの重複、混乱、または押しつぶされたデータにつながることはありません。できるだけそのように。

4

8 に答える 8

44

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/make-matplotlib-look-like-ggplot/

ほとんどの「入門」タイプの例で見られるように、標準の R プロットに焦点を当てていません。代わりに、ggplot2 のスタイルをエミュレートしようとします。ggplot2 は、スタイリッシュでよくデザインされているとほぼ普遍的に宣伝されているようです。

棒グラフのように軸スパインを取得するには、最初のいくつかの例の 1 つに従ってください: 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?すべてのオプションを確認できます。

Python での R スタイルの棒グラフ

そうそう。些細なことではありませんが、近づくことはできます。

于 2013-01-16T00:57:14.217 に答える
35

matplotlib >= 1.4 はスタイルをサポートしています(そして ggplot-style が組み込まれています):

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]: 
...

ここに画像の説明を入力

于 2014-01-19T18:56:42.090 に答える
28

# # # # # #

EDIT 10/14/2013: 詳細については、ggplot が Python 用に実装されました (matplotlib 上に構築されています)。

詳細と例については、このブログを参照するか、プロジェクトのgithub ページに直接アクセスしてください。

# # # # # #

私の知る限り、matplotlib には、R で作成したものと同様の外観を図に直接与える組み込みのソリューションはありません。

mpltoolsなどの一部のパッケージは、Matplotlib の rc-parameters を使用してスタイルシートのサポートを追加し、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 Webサイトのこの例から取得)。

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

たとえば、以下のコードと 2 つのプロットは、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()

画像

もちろん、プロットをRのものとまったく同じように見せるために、matplotlibでどのパラメーターを微調整する必要があるかを理解するには時間がかかりますが、今のところ他のオプションがあるかどうかはわかりません.

于 2013-01-16T04:49:32.503 に答える
10

「Rのggplotに相当する魅力的なPythonを提供する」ことを目的としたBokehをチェックします。例はこちら

編集: ggplot2 のビジュアル スタイルと構文を再現しようとする Seabornもチェックしてください。

于 2013-01-16T00:44:17.643 に答える
4

興味のある方は以下のブログ記事をお読みください。

Pandas GSoC2012 のプロット

http://pandasplotting.blogspot.com/

ggplot2 タイプのプロット インターフェイスを実装しようと決めました...実装する ggplot2 機能の量はまだわかりません...

著者は pandas をフォークし、かなり多くの ggplot2 スタイルの pandas 用文法を作成しました。

密度プロット

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

パンダのフォークはこちら: https://github.com/orbitfold/pandas

R の影響を受けたグラフィックスを作成するためのコードの肉はrplot.py、リポジトリのブランチにあるというファイルにあるようです。

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

これは本当にクールだと思いましたが、このプロジェクトが維持されているかどうかはわかりません。最後のコミットは少し前です。

于 2013-03-07T04:37:48.500 に答える
2

matplotlibrc でスパインを設定すると、Matplotlib のデフォルトを単純に編集して R スタイルのヒストグラムを生成できない理由が説明されています。散布図、 matplotlib の R スタイルのデータ軸バッファー、およびmatplotlib では、軸から外側を指す R スタイルの軸の目盛りをどのように描画しますか? より R っぽい外観にするために変更できるいくつかのデフォルトを示します。他のいくつかの回答から構築すると、次の関数は、hist()インスタンスAxesfacecolor='none'.

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
于 2013-08-06T02:19:43.313 に答える
1

Seaborn視覚化ライブラリがそれを可能にしますたとえば、R ヒストグラムのスタイルを再現するには、次を使用します。

sns.despine(offset=10, trim=True)

https://seaborn.pydata.org/tutorial/aesthetics.html#removing-axes-spinesのように

ここに画像の説明を入力

R 散布図のスタイルを再現するには、次を使用します。

sns.set_style("ticks")

https://seaborn.pydata.org/tutorial/aesthetics.html#seaborn-figure-stylesに示すように

ここに画像の説明を入力

于 2018-01-21T22:03:26.853 に答える
0

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

ここで何かプロットをして楽しんでください

于 2015-01-21T13:42:40.760 に答える