gpt4 book ai didi

Python matplotlib 对数自动缩放

转载 作者:行者123 更新时间:2023-12-01 03:54:05 28 4
gpt4 key购买 nike

我需要获得 x,y 图,其中 x 轴上有对数刻度。当我放大 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 轴上没有有效的自动缩放功能。我怎样才能让它正确显示?

最佳答案

@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 值的引用怎么办?

虽然这个解决方案/答案是解决这个示例问题的一个很好的“技巧”,但它对于我的情况来说并不是一个可靠的解决方案,因为我的图表是实时的;每分钟不断更新 b) 包含许多图 c) 正在丢弃过去 24 小时之前的数据;因此,如果每次在实时 session 中从情节中添加或删除某些内容时都实现这种解决方案,那么这种解决方案将变得非常棘手。

我对真正的内置“自动缩放”解决方案感兴趣,如果存在的话,它可以与 log y 缩放一起使用,并且我可以使用 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

关于Python matplotlib 对数自动缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37804331/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com