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

零不能绘制在 loglog 图上 (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 轴执行相同的操作。控制情节的一个方面需要很多代码,但如果 matplotlib.pyplot 很讨厌,我喜欢在用户函数中使用它。
这是用于反复试验的两个模板用户例程。我测试了第一个,它运行良好;我刚刚构建了第二个作为替代选项,但没有对其进行测试......如果它给出错误,请告诉我。

用户功能#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:传递一个轴和间隔的参数

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 回答