7

matplotlibでプロットしたポイントの周りにスペースを作成するにはどうすればよいですか?

たとえば、このプロットでは、左下の点が軸によって切り取られていますが、点と軸の間にもう少しスペースが必要です。 プロット例

import matplotlib.pyplot as plt
x = [2**i for i in xrange(4,14)]
y = [i**2 for i in x]
plt.loglog(x,y,'ro',basex=2,basey=2)
plt.xlim([0, 2**14]) # <--- this line does nothing
plt.show()

インタラクティブモードでは、行は、設定しようとしている新しい値ではなく、古い値をxlim返します。(16.0, 16384)

4

3 に答える 3

19

両対数グラフにゼロをプロットすることはできません(log(0)= -inf)。0を制限として使用できないため、サイレントに失敗しています。

plt.xlim([1,2**14])代わりに試してください。

于 2012-07-06T23:16:58.320 に答える
1

この問題を処理する一般的な方法を探していて、プロットの制限を自動的に調整したい場合(データをまったく知らなくても)、同様の質問に対するこの回答に触発されたスニペットを作成することもできます。

コードを少し微調整して変更し、y軸でも機能するようにする必要があることに注意してください。

于 2012-07-07T07:07:07.930 に答える
1

ここではplt.axis()、xminとxmaxの値を設定するために使用します(あなたのplt.xlim呼び出しと同様)。しかし、私は範囲と間隔に基づいて構築された変数「バッファ」を使用します。軸の範囲は、最小値と最大値を使用して導き出されます。対数目盛は0または負の値をプロットしないため、関数呼び出しxmin内で引数を1に設定します。.axis()

interval = 10

plot_range_buffer = (data.column.max() - data.column.min() / interval

plt.axis(
    xmin=1, # to keep scale if minimum is 0 or close to 0
    #xmin = data.column.min()-plot_range_buffer # subtracts interval buffer from min value
    xmax=data.column.max()+plot_range_buffer # adds the interval buffer to max value
)

必要に応じて、y軸でも同じことができます。プロットの1つの側面を制御するためのコードはたくさんありますが、matplotlib.pyplotが厄介な場合は、ユーザー関数内で使用するのが好きです。
試行錯誤のための2つのテンプレートユーザールーチンを次に示します。私は最初のものをテストしました、そしてそれはうまくいきました。代替オプションとして2つ目を作成しましたが、テストしませんでした...エラーが発生した場合はお知らせください。

ユーザー機能#1:機能内の完全な制御

def plotcolumn(some_row_entry):
    """Selects data for some row entry
       Creates a scatter plot from two column variables
       Allows for user control over buffers through manipulation
           of interval that is relative to axis max,min range"""

    # numpy fancy selector for input argument
    data = data[data.some_row_entry == some_row_entry]

    # establish plot
    data.plot.scatter(
        'first_column',
        'second_column',
        logx=True,                                   # turn log xaxis on/off
        #logy=True                                    # turn log yaxis on/off
    )

    # axis range controls
    x_interval = 10
    y_interval = 10

    # x axis (ie x-axis variable)
    x_buffer = (data.first_column.max() - data.first_column.min()) / x_interval

    # y axis (ie y-axis variable)
    y_buffer = (data.second_column.max() - data.second_column.min()) / y_interval

    plt.axis(
        xmin=1,                                      # use for xaxis lower buffer if logx and close to 0
        xmax=data.first_column.max()+x_buffer,       # sets xaxis upper buffer
        #xmin=data.first_column.min()-x_buffer,      # sets xaxis lower buffer if not logx close to 0

        #ymin= 1,                                     # use for yaxis lower buffer if logy and close to 0
        ymax= data.second_column.max()+y_buffer,     # sets yaxis upper buffer
        ymin= data.second_column.min()-y_buffer     # sets yaxis lower if not logy close to 0
    )

ユーザー関数#2: 1つの軸と間隔の引数を渡す

def plotcolumn_log_cond(some_row_entry, logaxis = 'x', interval = 10):

    """Selects data for some row entry
       Creates a scatter plot from two column variables.
       Arguments:
           Set axis to be logged (x or y as string)
           Pass interval value (as number)
       """


    # numpy fancy selector for input argument
    data = data[data.some_row_entry == some_row_entry]

    # establish plot
    data.plot.scatter(
        'first_column',
        'second_column',
        logx=True)


    # LOG XAXIS
    if logaxis = 'x':

        # establish plot
        data.plot.scatter(
            'first_column',
            'second_column',
            logx=True
        )

        # axis range controls
        x_interval = interval

        # x axis (ie x-axis variable)
        x_buffer = (data.first_column.max() - data.first_column.min()) / x_interval

        plt.axis(
            xmin=1,                                      # use for xaxis lower buffer if logx and close to 0
            xmax=data.first_column.max()+x_buffer,       # sets xaxis upper buffer
            #xmin=data.first_column.min()-x_buffer,      # sets xaxis lower buffer if not logx close to 0
        )


    # LOG YAXIS
    if logaxis = 'y':

        # establish plot
        data.plot.scatter(
            'first_column',
            'second_column',
            logy=True
        )

        # axis range controls
        y_interval = interval

        # x axis (ie x-axis variable)
        y_buffer = (data.second_column.max() - data.second_column.min()) / y_interval

        plt.axis(
            ymin=1,                                       # use for yaxis lower buffer if logy and close to 0
            ymax=data.second_column.max()+y_buffer,       # sets yaxis upper buffer
            #ymin=data.second_column.min()-y_buffer,      # sets yaxis lower buffer if not logy close to 0
        )


    # NOT X OR Y PASSED
    if (logaxis != 'x') & (logaxis != 'y'):

        # establish plot
        data.plot.scatter(
            'first_column',
            'second_column')
于 2020-04-19T04:35:24.650 に答える