matplotlib 使用与前一个轴相同的参数添加轴

yftpprvb  于 2023-06-06  发布在  其他
关注(0)|答案(6)|浏览(349)

我想用两个不同的子图来绘制数据。绘图后,我想返回到第一个子图,并在其中绘制一个额外的数据集。但是,当我这样做的时候,我得到了这样的警告:
MatplotlibDeprecationWarning:使用与前一个轴相同的参数添加轴当前会重用前一个示例。在未来的版本中,将始终创建并返回新示例。同时,通过向每个轴示例传递唯一的标签,可以抑制此警告,并确保未来的行为。warnings.warn(message,mplDeprecation,stacklevel=1)
我可以用一段简单的代码来重现它:

import matplotlib.pyplot as plt
import numpy as np

# Generate random data
data = np.random.rand(100)

# Plot in different subplots
plt.figure()
plt.subplot(1, 2, 1)
plt.plot(data)

plt.subplot(1, 2, 2)
plt.plot(data)

plt.subplot(1, 2, 1) # Warning occurs here
plt.plot(data + 1)

有什么办法可以避免这个警告吗?我使用matplotlib 2.1.0。看起来像here一样的问题

yyyllmsg

yyyllmsg1#

这是一个很好的例子,展示了使用matplotlibobject oriented API的好处。

import numpy as np
import matplotlib.pyplot as plt

# Generate random data
data = np.random.rand(100)

# Plot in different subplots
fig, (ax1, ax2) = plt.subplots(1, 2)
ax1.plot(data)

ax2.plot(data)

ax1.plot(data+1)

plt.show()
  • 注意:* 变量名以小写字母开头更符合Python风格,例如:data = ...而不是Data = ...参见PEP8
dm7nw8vv

dm7nw8vv2#

请注意,在这种情况下,警告是误报。在使用plt.subplot(..)重新激活先前创建的子图的情况下,理想情况下不应触发该选项。
出现此警告的原因是plt.subplotfig.add_subplot()在内部采用相同的代码路径。警告是针对后者,而不是前者。
要了解更多信息,请参阅issues 12513。长话短说,人们正在致力于此,但要将这两个功能解耦并不像最初想象的那么容易。目前,如果plt.subplot()触发了警告,您可以忽略它。

pes8fvy9

pes8fvy93#

使用plt.subplot(1,2,1)在当前图形中创建一个新轴。弃用警告表明,在未来的版本中,当您第二次调用它时,它不会抓取先前创建的轴,而是会覆盖它。
可以通过将轴的第一个示例赋给变量来保存对该示例的引用。

plt.figure()
# keep a reference to the first axis
ax1 = plt.subplot(1,2,1)
ax1.plot(Data)

# and a reference to the second axis
ax2 = plt.subplot(1,2,2)
ax2.plot(Data)

# reuse the first axis
ax1.plot(Data+1)
llmtgqce

llmtgqce4#

我也有同样的问题。我曾经有以下代码引发了警告:
(note变量Image只是我保存为numpy数组的图像)

import numpy as np
import matplotlib.pyplot as plt

plt.figure(1)  # create new image
plt.title("My image")  # set title
# initialize empty subplot
AX = plt.subplot()  # THIS LINE RAISED THE WARNING
plt.imshow(Image, cmap='gist_gray')  # print image in grayscale
...  # then some other operations

我解决了这个问题,修改如下:

import numpy as np
import matplotlib.pyplot as plt

fig_1 = plt.figure(1)  # create new image and assign the variable "fig_1" to it
AX = fig_1.add_subplot(111)  # add subplot to "fig_1" and assign another name to it
AX.set_title("My image")  # set title
AX.imshow(Image, cmap='gist_gray')  # print image in grayscale
...  # then some other operations
wooyq4lh

wooyq4lh5#

当您多次创建相同的轴对象时,将出现错误。在您的示例中,首先创建两个subplot对象(使用方法plt.subplot)。

type(plt.subplot(2, 1, 2)) Out: matplotlib.axes._subplots.AxesSubplot

python自动将上次创建的轴设置为默认值。轴仅表示不带数据的图的框架。这就是为什么你可以执行plt.plot(data)。方法plot(data)打印轴对象中的一些数据。当你尝试在同一个图中打印新的数据时,你不能只使用plt.subplot(2,1,2),因为python会在默认情况下尝试创建一个新的轴对象。所以你要做的是:将每个子图指定给一个变量。

ax1 = plt.subplot(2,1,1)
ax2 = plt.subplot(2,1,2)

然后选择您要打印数据的“帧”:

ax1.plot(data)
ax2.plot(data+1)
ax1.plot(data+2)

如果您有兴趣绘制更多图形(例如5)在一个图形中,首先创建一个图形。您的数据存储在PandasDataFrame中,并且您在列表中为每个列创建一个新的轴元素。然后循环遍历列表,在每个轴元素中绘制数据并选择属性

import pandas as pd 
import matplotlib.pyplot as plt 

#want to print all columns
data = pd.DataFrame('some Datalist')
plt.figure(1)
axis_list = []

#create all subplots in a list 
for i in range(data.shape[1]):
axis_list.append(plt.subplot(data.shape[1],1,i+1)

for i,ax in enumerate(axis_list):

    # add some options to each subplot  
    ax.grid(True)
    #print into subplots
    ax.plot(data.iloc[:,[i]])
csga3l58

csga3l586#

我们可以为每个轴添加唯一的标签来绘制它。
ax = plt.subplot(label='testlabel')

相关问题