Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/IPython/core/magics/pylab.py: 48%

46 statements  

« prev     ^ index     » next       coverage.py v7.4.4, created at 2024-04-20 06:09 +0000

1"""Implementation of magic functions for matplotlib/pylab support. 

2""" 

3#----------------------------------------------------------------------------- 

4# Copyright (c) 2012 The IPython Development Team. 

5# 

6# Distributed under the terms of the Modified BSD License. 

7# 

8# The full license is in the file COPYING.txt, distributed with this software. 

9#----------------------------------------------------------------------------- 

10 

11#----------------------------------------------------------------------------- 

12# Imports 

13#----------------------------------------------------------------------------- 

14 

15# Our own packages 

16from traitlets.config.application import Application 

17from IPython.core import magic_arguments 

18from IPython.core.magic import Magics, magics_class, line_magic 

19from IPython.testing.skipdoctest import skip_doctest 

20from warnings import warn 

21from IPython.core.pylabtools import backends 

22 

23#----------------------------------------------------------------------------- 

24# Magic implementation classes 

25#----------------------------------------------------------------------------- 

26 

27magic_gui_arg = magic_arguments.argument( 

28 'gui', nargs='?', 

29 help="""Name of the matplotlib backend to use %s. 

30 If given, the corresponding matplotlib backend is used, 

31 otherwise it will be matplotlib's default 

32 (which you can set in your matplotlib config file). 

33 """ % str(tuple(sorted(backends.keys()))) 

34) 

35 

36 

37@magics_class 

38class PylabMagics(Magics): 

39 """Magics related to matplotlib's pylab support""" 

40 

41 @skip_doctest 

42 @line_magic 

43 @magic_arguments.magic_arguments() 

44 @magic_arguments.argument('-l', '--list', action='store_true', 

45 help='Show available matplotlib backends') 

46 @magic_gui_arg 

47 def matplotlib(self, line=''): 

48 """Set up matplotlib to work interactively. 

49 

50 This function lets you activate matplotlib interactive support 

51 at any point during an IPython session. It does not import anything 

52 into the interactive namespace. 

53 

54 If you are using the inline matplotlib backend in the IPython Notebook 

55 you can set which figure formats are enabled using the following:: 

56 

57 In [1]: from matplotlib_inline.backend_inline import set_matplotlib_formats 

58 

59 In [2]: set_matplotlib_formats('pdf', 'svg') 

60 

61 The default for inline figures sets `bbox_inches` to 'tight'. This can 

62 cause discrepancies between the displayed image and the identical 

63 image created using `savefig`. This behavior can be disabled using the 

64 `%config` magic:: 

65 

66 In [3]: %config InlineBackend.print_figure_kwargs = {'bbox_inches':None} 

67 

68 In addition, see the docstrings of 

69 `matplotlib_inline.backend_inline.set_matplotlib_formats` and 

70 `matplotlib_inline.backend_inline.set_matplotlib_close` for more information on 

71 changing additional behaviors of the inline backend. 

72 

73 Examples 

74 -------- 

75 To enable the inline backend for usage with the IPython Notebook:: 

76 

77 In [1]: %matplotlib inline 

78 

79 In this case, where the matplotlib default is TkAgg:: 

80 

81 In [2]: %matplotlib 

82 Using matplotlib backend: TkAgg 

83 

84 But you can explicitly request a different GUI backend:: 

85 

86 In [3]: %matplotlib qt 

87 

88 You can list the available backends using the -l/--list option:: 

89 

90 In [4]: %matplotlib --list 

91 Available matplotlib backends: ['osx', 'qt4', 'qt5', 'gtk3', 'gtk4', 'notebook', 'wx', 'qt', 'nbagg', 

92 'gtk', 'tk', 'inline'] 

93 """ 

94 args = magic_arguments.parse_argstring(self.matplotlib, line) 

95 if args.list: 

96 backends_list = list(backends.keys()) 

97 print("Available matplotlib backends: %s" % backends_list) 

98 else: 

99 gui, backend = self.shell.enable_matplotlib(args.gui.lower() if isinstance(args.gui, str) else args.gui) 

100 self._show_matplotlib_backend(args.gui, backend) 

101 

102 @skip_doctest 

103 @line_magic 

104 @magic_arguments.magic_arguments() 

105 @magic_arguments.argument( 

106 '--no-import-all', action='store_true', default=None, 

107 help="""Prevent IPython from performing ``import *`` into the interactive namespace. 

108 

109 You can govern the default behavior of this flag with the 

110 InteractiveShellApp.pylab_import_all configurable. 

111 """ 

112 ) 

113 @magic_gui_arg 

114 def pylab(self, line=''): 

115 """Load numpy and matplotlib to work interactively. 

116 

117 This function lets you activate pylab (matplotlib, numpy and 

118 interactive support) at any point during an IPython session. 

119 

120 %pylab makes the following imports:: 

121 

122 import numpy 

123 import matplotlib 

124 from matplotlib import pylab, mlab, pyplot 

125 np = numpy 

126 plt = pyplot 

127 

128 from IPython.display import display 

129 from IPython.core.pylabtools import figsize, getfigs 

130 

131 from pylab import * 

132 from numpy import * 

133 

134 If you pass `--no-import-all`, the last two `*` imports will be excluded. 

135 

136 See the %matplotlib magic for more details about activating matplotlib 

137 without affecting the interactive namespace. 

138 """ 

139 args = magic_arguments.parse_argstring(self.pylab, line) 

140 if args.no_import_all is None: 

141 # get default from Application 

142 if Application.initialized(): 

143 app = Application.instance() 

144 try: 

145 import_all = app.pylab_import_all 

146 except AttributeError: 

147 import_all = True 

148 else: 

149 # nothing specified, no app - default True 

150 import_all = True 

151 else: 

152 # invert no-import flag 

153 import_all = not args.no_import_all 

154 

155 gui, backend, clobbered = self.shell.enable_pylab(args.gui, import_all=import_all) 

156 self._show_matplotlib_backend(args.gui, backend) 

157 print( 

158 "%pylab is deprecated, use %matplotlib inline and import the required libraries." 

159 ) 

160 print("Populating the interactive namespace from numpy and matplotlib") 

161 if clobbered: 

162 warn("pylab import has clobbered these variables: %s" % clobbered + 

163 "\n`%matplotlib` prevents importing * from pylab and numpy" 

164 ) 

165 

166 def _show_matplotlib_backend(self, gui, backend): 

167 """show matplotlib message backend message""" 

168 if not gui or gui == 'auto': 

169 print("Using matplotlib backend: %s" % backend)