繁体   English   中英

如何在 Jupyter Notebook 的不同单元格中更改 matplotlib 图形?

[英]How to change a matplotlib figure in a different cell in Jupyter Notebook?

我正在学习如何在 Jupyter Notebook 中使用 matplotlib 创建和修改绘图。 我在笔记本的开头添加了以下魔法函数和导入语句:

%matplotlib inline
import numpy as np 
import matplotlib.pyplot as plt

然后,我创建了一个单元格并添加了以下所有代码:


x = np.array([1, 2, 3, 4, 5, 6, 7, 8])
y = x
plt.figure()
plt.scatter(x[:2], y[:2], s=100, c='red', label='Red data')
plt.scatter(x[2:], y[2:], s = 100, c='blue', label='Blue data')
plt.xlabel('This is my x label')
plt.ylabel('This is my y label')
plt.title('This is my plot title')

在这种情况下,情节本身似乎很好,尽管我不明白为什么添加了额外的Text(0.5, 1.0, 'This is my plot title')行,而 xlabel 和 ylabel 文本对象没有任何内容。 在此处输入图片说明

现在我发现总是必须将与情节有关的每个命令都强制放入一个单元格中是不切实际的。 我希望能够在一个单元格中创建基本绘图,并在不同的单元格中为其添加标签和图例(稍后对绘图进行其他操作,但这不是此问题的主题)。 为此,我需要引用在第一个单元格中创建的图 - 为此,我使用了plt.gcf() 但是,当我运行以下代码时,Python / matplotlib / Jupyter 将不同的单元格完全视为不同的图。 (注意:虚线分隔表示不同的 Jupyter Notebook 单元。)

plt.figure()
plt.scatter(x[:2], y[:2], s=100, c='red', label='Red data')
plt.scatter(x[2:], y[2:], s = 100, c='blue', label='Blue data')
#-------------------------------------------------------------
plt.gcf()
plt.xlabel('This is my x label')
plt.ylabel('This is my y label')
plt.title('This is my plot title')
#-------------------------------------------------------------
plt.gcf()
plt.legend(loc=4, frameon=False, title='Legend')

输出如下: 在此处输入图片说明

我尝试将%matplotlib inline更改为显然更现代的%matplotlib notebook但没有帮助。 我也尝试从单元格的开头删除plt.gcf()行,但我仍然得到相同的输出。

编辑我的版本是:

  • 蟒蛇 3.7.0
  • matplotlib 3.2.2
  • ipykernel 5.2.1
  • ipywidgets 7.5.1
  • jupyter 1.0.0
  • jupyter_core 4.6.3
  • jupyter_client 6.1.6
  • 笔记本 6.0.3
  • 视窗 10

将图形保存到像fig这样的变量,然后使用fig.gca()获取当前轴
(对于额外的绘图命令)会做到这一点。

首先导入包并使用 matplotlib 内联环境:

import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline

然后获取您的数据并为其创建散点图(同时将图保存为图形)

# Generate some random data
x = np.arange(1,3)
y = x
x2 = np.arange(3,11)
y2 = x2
x3 = np.arange(11,21)
y3 = x3

# Create initial figure
fig = plt.figure()
plt.scatter(x, y, linewidth=5)

情节 1
然后使用fig.gca()技巧绘制更多数据( fig线显示单元格下的图):

fig.gca().scatter(x2, y2, color='r', linewidth=5)
fig

情节2
添加最终数据:

fig.gca().scatter(x3, y3, color='g', linewidth=5)
fig

图 3
添加图例:

fig.legend(['Blue Data','Red Data','Green Data'], loc='lower right')
fig

图 4
最后,添加 x/y 标签和标题:

fig.gca().set_xlabel('My x label')
fig.gca().set_ylabel('My y label')
fig.gca().set_title('A title')
fig

图 5

正如您在我的代码中所看到的,对绘图的每个添加(数据、轴标题等)都是在单独的单元格中完成的

如果不是将第一行作为

%matplotlib inline

你改用,

%matplotlib notebook

例如,请参阅此处的讨论。 (并且您需要重新启动内核才能执行此操作。)

另外,请记住,pyplot 界面“主要用于交互式绘图和程序化绘图生成的简单案例”。

对于构建更复杂的图,就像您正在做的那样,OO 界面更强大。 例如,使用OO 界面,您可以轻松创建两个轴,在一个单元格中为每个轴设置标题,并在下一个单元格中为每个轴设置标签。 保持和处理所有事情要容易得多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM