Python matplotlib对数自动缩放

时间:2016-06-14 06:20:56

标签: python matplotlib

我需要在x轴上得到一个对数刻度的x,y图。当我放大x轴应该自动缩放为(非对数)y轴。

plt.xscale('log')
plt.grid(True)
plt.autoscale(True,True,True)
plt.legend(loc='best')
plt.show()

Normal print

Zoomed in print

正如您所看到的,x轴上没有可用的自动缩放功能。 如何正确显示?

3 个答案:

答案 0 :(得分:2)

@ hashcode55的解决方案不起作用,因为它是我在找到这个帖子之前尝试的。

在我看来,其中只有一个“错误”:

plt.yscale('log')
plt.autoscale(enable=True, axis='y')

不兼容。

以下是我的示例代码:

import matplotlib.pyplot as plt
import matplotlib
import random
import numpy as np

# generate some random data and add it to the plot
x = np.array(range(1,100))
y = np.maximum(np.ones(99), np.random.randn(99))
plt.plot(x, y, markersize=4, marker='.', color='red')

# format
ax = plt.gca()
plt.ylabel('LOGARITHMIC SCALE')
plt.yscale('log')
plt.minorticks_on
ax.yaxis.set_major_formatter(matplotlib.ticker.ScalarFormatter())
ax.yaxis.set_minor_formatter(matplotlib.ticker.ScalarFormatter())
plt.autoscale(enable=True, axis='y')

#ax.set_ylim([np.min(y), np.max(y)])

#plot
plt.show()

产生:

enter image description here

日志比例,但显然不是自动缩放

如果我删除此行中的评论:

ax.set_ylim([np.min(y), np.max(y)])

然后它实际上是用自动缩放预期绘制的:

enter image description here

很好,但如果我在情节中丢失了对y值的引用会怎么样?

虽然这个解决方案/答案是对这个示例问题的一个很好的“黑客”,但它不是我的情况的可靠解决方案,因为我的图表是a)直播;每分钟不断更新b)包含许多图表c)正在丢弃超过24小时的数据;因此,如果每次在实时会话中添加或删除某些内容时实施此类解决方案都会变得非常糟糕。

我会对真正的内置“自动缩放”解决方案感兴趣,如果存在,可以使用log y scale,我可以使用plt.ion()自动更新

直到那时,这是怎么回事:

h / t @David Z. How to extract data from matplotlib plot

#if you do need to get data out of a plot, I think this should do it

gca().get_lines()[n].get_xydata()

#Alternatively you can get the x and y data sets separately:

line = gca().get_lines()[n]
xd = line.get_xdata()
yd = line.get_ydata()

在我们手头的情况下实现(使用额外的蓝线来测试多行):

import matplotlib.pyplot as plt
import matplotlib
import random
import numpy as np

# generate some random data and add it to the plot
x = np.array(range(1,100))
y = np.maximum(np.ones(99), np.random.randn(99))
plt.plot(x, y, markersize=4, marker='.', color='red')

# test for compatibility with multilpes lines
x = np.array(range(1,100))
y = np.maximum(np.ones(99), 1.5*np.random.randn(99))
plt.plot(x, y, markersize=4, marker='.', color='blue')

# format
ax = plt.gca()
plt.ylabel('LOGARITHMIC SCALE')
plt.yscale('log')
plt.minorticks_on
ax.yaxis.set_major_formatter(matplotlib.ticker.ScalarFormatter())
ax.yaxis.set_minor_formatter(matplotlib.ticker.ScalarFormatter())
#plt.autoscale(enable=True, axis='y')

#####################################################
#force 'autoscale'
#####################################################
yd = [] #matrix of y values from all lines on plot
for n in range(len(plt.gca().get_lines())):
        line = plt.gca().get_lines()[n]
        yd.append(line.get_ydata())
ax.set_ylim([0.9*np.min(yd), 1.1*np.max(yd)])
#####################################################  

#plot
plt.show()

实际上是从图上的所有行中提取所有y数据,找到最大值和最小值;然后通过set_ylim实施; “强制”自动缩放

的产率:

enter image description here

瞧!

对于我的情况,我的格式有点复杂:

plt.plot((x1,x2), (y1,y2))

在矩阵情境中创建矩阵,产生'价值误差'

因为我不得不使用:

yd = [item for sublist in yd for item in sublist]

h / t @Alex Martelli Making a flat list out of list of lists in Python

这是最终产品:

#####################################################
#force 'autoscale'
#####################################################
yd = [] #matrix of y values from all lines on plot
for n in range(len(plt.gca().get_lines())):
        line = plt.gca().get_lines()[n]
        yd.append((line.get_ydata()).tolist())

yd = [item for sublist in yd for item in sublist]
ax.set_ylim([0.9*np.min(yd), 1.1*np.max(yd)])
#####################################################

enter image description here

答案 1 :(得分:0)

如果您查看文档,该功能就像 -

header.hpp

您发送的内容无效......

只是做到了

matplotlib.pyplot.autoscale(enable=True, axis='both', tight=None)

关于紧张 -

  

如果为True,则将视图限制设置为数据限制;如果为假,请让定位器和   利润扩大了观点限制;如果没有,请使用紧密缩放   艺术家是一个形象,否则视为错误。紧张的环境   保留以供将来自动缩放,直到明确更改为止。

答案 2 :(得分:0)

我有一个类似的问题,我能够通过在绘制之前设置“对数”比例来解决。在这种情况下,自动缩放功能将按预期工作。