详细介绍matplotlib的两种绘图方法:
matplolib.pyplot
面向对象绘图
欢迎随缘关注@pythonic生物人
目录
1、Matplotlib之父简介
2、matplotlib图形结构
figure层
axes层
一张matplotlib图
3、matplotlib两种画绘图方法
方法一:使用matplotlib.pyplot
matplotlib.pyplot简介
pyplot方法绘图举例
方法二:面向对象方法
matplotlib.figure.Figure
matplotlib.axes.Axes
面向对象方法绘图举例
1、Matplotlib之父简介
首先,来回顾Matplotlib之父John D. Hunter辉煌而短暂的一生,国内介绍的资料太少了,查阅了一番整理如下:
- 1968 出身于美国的田纳西州代尔斯堡。
- 之后求学于普林斯顿大学。
- 2003年发布Matplotlib 0.1版,初衷是博士研究期间为可视化癫痫患者的脑电图(ECoG)数据;
- 之后,美国国家航空航天局(NASA)太空望远镜科学研究所的哈勃望远镜背后团队(Hubble Space Telescope),选择Matplotlib作为了画图程序包,并一直为 Matplotlib 开发团队提供资金支持,从而大大促进了 Matplotlib 的发展。
- 2004 年于芝加哥大学获得神经生物学方向博士学位。
- 2005年供职于芝加哥的一家投资公司,从事量化分析(真是生物人遍布各行各业)。
- 之后以董事的身份创立了专为数据科学赞助的非盈利组织 NumFOCUS Foundation。
- 2007年美国凤凰号探测器(Phoenix spacecraft)登录火星,NASA使用Matplotlib可视化了第一张黑洞的图片。
- 2012年因John D. Hunter个人对Python和数据科学方向的杰出贡献,被Python社区授予第一届PSF Distinguished Service Awards奖项 :https://www.python.org/community/awards/psf-distinguished-awards/ 。
- 2012.08 因患恶性结肠癌英年早逝,享年44岁。
- 虽然Matplotlib之父已经去世,但是,大量开源爱好者在fork着这个可视化包,延续着辉煌 https://github.com/matplotlib。
- NumFOCUS 组织每年夏天会赞助1到2个学生,在高级贡献者的带领下,为Matplolib全职工作10周左右(2018年奖金多达$6,000):https://numfocus.org/programs/john-hunter-technology-fellowship 。
- 2013年起,SciPy每年举行可视化比赛: John Hunter Excellence in Plotting Competition,一是为了为了纪念John Hunter的贡献,二是为了强调数据可视化对科学进步的重要性,并展示开源软件力量。https://jhepc.github.io/about.html ;2020年报名截止日期为06月01号,奖金优渥(1st prize: $1000;2nd prize: $750;3rd prize: $500):https://jhepc.github.io/index.html 。
2、matplotlib图形结构
figure层
指整张图,可设置整张图的分辨率(dpi),长宽(figsize)、标题(title)等特征;
可包含多个axes,可简单理解为多个子图(下图为两个axes);
figure置于canvas系统层之上,用户不可见。
axes层
每个子图,可以绘制各种图形,例如柱状图(bar),饼图(pie函数),箱图(boxplot)等;
设置每个图的外观网格线(grid)的开关、坐标轴(axis)开关等;
设置每个坐标轴(axis)的名字(label)、子图标题(title)、图例(legend)等;
设置坐标轴范围(scale)、坐标轴刻度(tricks)等;下图中具有两个axes:
一张matplotlib图
下面这张matplotlib图包含一张图的常见元素 ,例如标题、坐标轴、轴标签、刻度、文本注释、图例等。下面的内容会涉及到python面向对象和模块相关的简单知识,为了更好理解,可戳:
python3基础10面向“对象”编程
3、matplotlib两种画绘图方法
我们常常在别人的绘图代码中看到同一张图能使用两种完全不同的方式绘制出来,这可能是因为它使用了pyplot方法和面向对象的两种实现方法。
方法一:使用matplotlib.pyplot
-
matplotlib.pyplot简介
这种绘图主要使用pyplot模块,pyplot.py代码量有3000多行(windows下存储于xxx\site-packages\matplotlib\pyplot.py),该脚本里面有大量def定义的函数,绘图时就是调用pyplot.py中的函数。查看pyplot所有属性如下,绘图时可以按需求使用如下属性。子模块(蓝色部分)、名词属性(黄色部分)和函数(下图红色部分)详细使用见:https://matplotlib.org/api/_as_gen/matplotlib.pyplot.html
['Annotation', 'Arrow', 'Artist', 'AutoLocator', 'Axes', 'Button', 'Circle', 'Figure', 'FigureCanvasBase', 'FixedFormatter', 'FixedLocator', 'FormatStrFormatter', 'Formatter', 'FuncFormatter', 'GridSpec', 'IndexLocator', 'Line2D', 'LinearLocator', 'Locator', 'LogFormatter', 'LogFormatterExponent', 'LogFormatterMathtext', 'LogLocator', 'MaxNLocator', 'MultipleLocator', 'Normalize', 'NullFormatter', 'NullLocator', 'Number', 'PolarAxes', 'Polygon', 'Rectangle', 'ScalarFormatter', 'Slider', 'Subplot', 'SubplotTool', 'Text', 'TickHelper', 'Widget', '_INSTALL_FIG_OBSERVER', '_IP_REGISTERED', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_auto_draw_if_interactive', '_backend_mod', '_get_running_interactive_framework', '_interactive_bk', '_log', '_pylab_helpers', '_setp', '_setup_pyplot_info_docstrings', '_show', 'acorr', 'angle_spectrum', 'annotate', 'arrow', 'autoscale', 'autumn', 'axes', 'axhline', 'axhspan', 'axis', 'axvline', 'axvspan', 'bar', 'barbs', 'barh', 'bone', 'box', 'boxplot', 'broken_barh', 'cbook', 'cla', 'clabel', 'clf', 'clim', 'close', 'cm', 'cohere', 'colorbar', 'colormaps', 'connect', 'contour', 'contourf', 'cool', 'copper', 'csd', 'cycler', 'dedent', 'delaxes', 'deprecated', 'disconnect', 'docstring', 'draw', 'draw_all', 'draw_if_interactive', 'errorbar', 'eventplot', 'figaspect', 'figimage', 'figlegend', 'fignum_exists', 'figtext', 'figure', 'fill', 'fill_between', 'fill_betweenx', 'findobj', 'flag', 'functools', 'gca', 'gcf', 'gci', 'get', 'get_backend', 'get_cmap', 'get_current_fig_manager', 'get_figlabels', 'get_fignums', 'get_plot_commands', 'get_scale_docs', 'get_scale_names', 'getp', 'ginput', 'gray', 'grid', 'hexbin', 'hist', 'hist2d', 'hlines', 'hot', 'hsv', 'importlib', 'imread', 'imsave', 'imshow', 'inferno', 'inspect', 'install_repl_displayhook', 'interactive', 'ioff', 'ion', 'isinteractive', 'jet', 'legend', 'locator_params', 'logging', 'loglog', 'magma', 'magnitude_spectrum', 'margins', 'matplotlib', 'matshow', 'minorticks_off', 'minorticks_on', 'mlab', 'new_figure_manager', 'nipy_spectral', 'np', 'pause', 'pcolor', 'pcolormesh', 'phase_spectrum', 'pie', 'pink', 'plasma', 'plot', 'plot_date', 'plotfile', 'plotting', 'polar', 'prism', 'psd', 'pylab_setup', 'quiver', 'quiverkey', 'rc', 'rcParams', 'rcParamsDefault', 'rcParamsOrig', 'rc_context', 'rcdefaults', 'rcsetup', 're', 'register_cmap', 'rgrids', 'savefig', 'sca', 'scatter', 'sci', 'semilogx', 'semilogy', 'set_cmap', 'set_loglevel', 'setp', 'show', 'silent_list', 'specgram', 'spring', 'spy', 'stackplot', 'stem', 'step', 'streamplot', 'style', 'subplot', 'subplot2grid', 'subplot_tool', 'subplots', 'subplots_adjust', 'summer', 'suptitle', 'switch_backend', 'sys', 'table', 'text', 'thetagrids', 'tick_params', 'ticklabel_format', 'tight_layout', 'time', 'title', 'tricontour', 'tricontourf', 'tripcolor', 'triplot', 'twinx', 'twiny', 'uninstall_repl_displayhook', 'violinplot', 'viridis', 'vlines', 'waitforbuttonpress', 'warn_deprecated', 'winter', 'xcorr', 'xkcd', 'xlabel', 'xlim', 'xscale', 'xticks', 'ylabel', 'ylim', 'yscale', 'yticks']
-
pyplot方法绘图举例
#matplotlib.pyplot 接口
import numpy as np
import matplotlib.pyplot as plt#导入pyplot,matplotlib.pyplot简写为plt
def f(t):
return np.exp(-t) * np.cos(2*np.pi*t)
t1 = np.arange(0.0, 5.0, 0.1)
t2 = np.arange(0.0, 5.0, 0.02)
plt.figure(dpi=100)
plt.subplot(211)
plt.plot(t1, f(t1), color='tab:blue', marker='o')
plt.plot(t2, f(t2), color='black')
plt.title('demo')
plt.subplot(212)
plt.plot(t2, np.cos(2*np.pi*t2), color='tab:orange', linestyle='--')
plt.suptitle('matplotlib.pyplot api')
plt.show()
方法二:面向对象方法
画比较复杂的图形时,面向对象方法会更方便。这种绘图方式主要使用matplotlib的两个子类:matplotlib.figure.Figure和matplotlib.axes.Axes,画每张图时,画布为matplotlib.figure.Figure的一个实例,每个子图为matplotlib.axes.Axes的一个实例,分别可以继承父类的所有方法,也就是说你绘图时,你想设置的元素(网格线啊,坐标刻度啊等)都可以在二者的属性中找出来使用。
-
matplotlib.figure.Figure
该对象主要用于figure的调整,具有的属性如下,详细使用见:https://matplotlib.org/api/_as_gen/matplotlib.figure.Figure.html#matplotlib.figure.Figure
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_add_axes_internal', '_gci', '_get_axes', '_get_clipping_extent_bbox', '_get_dpi', '_make_key', '_process_projection_requirements', '_prop_order', '_remove_ax', '_repr_html_', '_set_artist_props', '_set_dpi', '_set_gc_clip', 'add_artist', 'add_axes', 'add_axobserver', 'add_callback', 'add_gridspec', 'add_subplot', 'align_labels', 'align_xlabels', 'align_ylabels', 'aname', 'autofmt_xdate', 'axes', 'clear', 'clf', 'colorbar', 'contains', 'convert_xunits', 'convert_yunits', 'delaxes', 'dpi', 'draw', 'draw_artist', 'execute_constrained_layout', 'figimage', 'findobj', 'format_cursor_data', 'frameon', 'gca', 'get_agg_filter', 'get_alpha', 'get_animated', 'get_axes', 'get_children', 'get_clip_box', 'get_clip_on', 'get_clip_path', 'get_constrained_layout', 'get_constrained_layout_pads', 'get_contains', 'get_cursor_data', 'get_default_bbox_extra_artists', 'get_dpi', 'get_edgecolor', 'get_facecolor', 'get_figheight', 'get_figure', 'get_figwidth', 'get_frameon', 'get_gid', 'get_in_layout', 'get_label', 'get_path_effects', 'get_picker', 'get_rasterized', 'get_size_inches', 'get_sketch_params', 'get_snap', 'get_tight_layout', 'get_tightbbox', 'get_transform', 'get_transformed_clip_path_and_affine', 'get_url', 'get_visible', 'get_window_extent', 'get_zorder', 'ginput', 'have_units', 'init_layoutbox', 'is_transform_set', 'legend', 'mouseover', 'pchanged', 'pick', 'pickable', 'properties', 'remove', 'remove_callback', 'savefig', 'sca', 'set', 'set_agg_filter', 'set_alpha', 'set_animated', 'set_canvas', 'set_clip_box', 'set_clip_on', 'set_clip_path', 'set_constrained_layout', 'set_constrained_layout_pads', 'set_contains', 'set_dpi', 'set_edgecolor', 'set_facecolor', 'set_figheight', 'set_figure', 'set_figwidth', 'set_frameon', 'set_gid', 'set_in_layout', 'set_label', 'set_path_effects', 'set_picker', 'set_rasterized', 'set_size_inches', 'set_sketch_params', 'set_snap', 'set_tight_layout', 'set_transform', 'set_url', 'set_visible', 'set_zorder', 'show', 'stale', 'sticky_edges', 'subplots', 'subplots_adjust', 'suptitle', 'text', 'tight_layout', 'update', 'update_from', 'waitforbuttonpress', 'zorder']
-
matplotlib.axes.Axes
该对象的主要用于figure中每个axes的调整,拥有的名词属性(黄色部分)和函数(下图红色部分),详细使用见:https://matplotlib.org/api/axes_api.html
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_add_text', '_convert_dx', '_gci', '_gen_axes_patch', '_gen_axes_spines', '_get_axis_list', '_get_clipping_extent_bbox', '_get_view', '_init_axis', '_make_twin_axes', '_on_units_changed', '_parse_scatter_color_args', '_pcolorargs', '_process_unit_info', '_prop_order', '_quiver_units', '_remove_legend', '_sci', '_set_artist_props', '_set_gc_clip', '_set_lim_and_transforms', '_set_position', '_set_title_offset_trans', '_set_view', '_set_view_from_bbox', '_shared_x_axes', '_shared_y_axes', '_twinned_axes', '_update_image_limits', '_update_line_limits', '_update_patch_limits', '_update_title_position', '_update_transScale', '_validate_converted_limits', 'acorr', 'add_artist', 'add_callback', 'add_child_axes', 'add_collection', 'add_container', 'add_image', 'add_line', 'add_patch', 'add_table', 'aname', 'angle_spectrum', 'annotate', 'apply_aspect', 'arrow', 'autoscale', 'autoscale_view', 'axes', 'axhline', 'axhspan', 'axis', 'axvline', 'axvspan', 'bar', 'barbs', 'barh', 'boxplot', 'broken_barh', 'bxp', 'can_pan', 'can_zoom', 'cla', 'clabel', 'clear', 'cohere', 'contains', 'contains_point', 'contour', 'contourf', 'convert_xunits', 'convert_yunits', 'csd', 'drag_pan', 'draw', 'draw_artist', 'end_pan', 'errorbar', 'eventplot', 'fill', 'fill_between', 'fill_betweenx', 'findobj', 'format_coord', 'format_cursor_data', 'format_xdata', 'format_ydata', 'get_adjustable', 'get_agg_filter', 'get_alpha', 'get_anchor', 'get_animated', 'get_aspect', 'get_autoscale_on', 'get_autoscalex_on', 'get_autoscaley_on', 'get_axes_locator', 'get_axisbelow', 'get_children', 'get_clip_box', 'get_clip_on', 'get_clip_path', 'get_contains', 'get_cursor_data', 'get_data_ratio', 'get_data_ratio_log', 'get_default_bbox_extra_artists', 'get_facecolor', 'get_fc', 'get_figure', 'get_frame_on', 'get_gid', 'get_images', 'get_in_layout', 'get_label', 'get_legend', 'get_legend_handles_labels', 'get_lines', 'get_navigate', 'get_navigate_mode', 'get_path_effects', 'get_picker', 'get_position', 'get_rasterization_zorder', 'get_rasterized', 'get_renderer_cache', 'get_shared_x_axes', 'get_shared_y_axes', 'get_sketch_params', 'get_snap', 'get_tightbbox', 'get_title', 'get_transform', 'get_transformed_clip_path_and_affine', 'get_url', 'get_visible', 'get_window_extent', 'get_xaxis', 'get_xaxis_text1_transform', 'get_xaxis_text2_transform', 'get_xaxis_transform', 'get_xbound', 'get_xgridlines', 'get_xlabel', 'get_xlim', 'get_xmajorticklabels', 'get_xminorticklabels', 'get_xscale', 'get_xticklabels', 'get_xticklines', 'get_xticks', 'get_yaxis', 'get_yaxis_text1_transform', 'get_yaxis_text2_transform', 'get_yaxis_transform', 'get_ybound', 'get_ygridlines', 'get_ylabel', 'get_ylim', 'get_ymajorticklabels', 'get_yminorticklabels', 'get_yscale', 'get_yticklabels', 'get_yticklines', 'get_yticks', 'get_zorder', 'grid', 'has_data', 'have_units', 'hexbin', 'hist', 'hist2d', 'hlines', 'imshow', 'in_axes', 'indicate_inset', 'indicate_inset_zoom', 'inset_axes', 'invert_xaxis', 'invert_yaxis', 'is_transform_set', 'legend', 'locator_params', 'loglog', 'magnitude_spectrum', 'margins', 'matshow', 'minorticks_off', 'minorticks_on', 'mouseover', 'mouseover_set', 'name', 'pchanged', 'pcolor', 'pcolorfast', 'pcolormesh', 'phase_spectrum', 'pick', 'pickable', 'pie', 'plot', 'plot_date', 'properties', 'psd', 'quiver', 'quiverkey', 'redraw_in_frame', 'relim', 'remove', 'remove_callback', 'reset_position', 'scatter', 'secondary_xaxis', 'secondary_yaxis', 'semilogx', 'semilogy', 'set', 'set_adjustable', 'set_agg_filter', 'set_alpha', 'set_anchor', 'set_animated', 'set_aspect', 'set_autoscale_on', 'set_autoscalex_on', 'set_autoscaley_on', 'set_axes_locator', 'set_axis_off', 'set_axis_on', 'set_axisbelow', 'set_clip_box', 'set_clip_on', 'set_clip_path', 'set_contains', 'set_facecolor', 'set_fc', 'set_figure', 'set_frame_on', 'set_gid', 'set_in_layout', 'set_label', 'set_navigate', 'set_navigate_mode', 'set_path_effects', 'set_picker', 'set_position', 'set_prop_cycle', 'set_rasterization_zorder', 'set_rasterized', 'set_sketch_params', 'set_snap', 'set_title', 'set_transform', 'set_url', 'set_visible', 'set_xbound', 'set_xlabel', 'set_xlim', 'set_xmargin', 'set_xscale', 'set_xticklabels', 'set_xticks', 'set_ybound', 'set_ylabel', 'set_ylim', 'set_ymargin', 'set_yscale', 'set_yticklabels', 'set_yticks', 'set_zorder', 'specgram', 'spy', 'stackplot', 'stale', 'start_pan', 'stem', 'step', 'sticky_edges', 'streamplot', 'table', 'text', 'tick_params', 'ticklabel_format', 'tricontour', 'tricontourf', 'tripcolor', 'triplot', 'twinx', 'twiny', 'update', 'update_datalim', 'update_datalim_bounds', 'update_from', 'use_sticky_edges', 'violin', 'violinplot', 'vlines', 'xaxis_date', 'xaxis_inverted', 'xcorr', 'yaxis_date', 'yaxis_inverted', 'zorder']
-
面向对象方法绘图举例
import numpy as np
import matplotlib.pyplot as plt
def f(t):
return np.exp(-t) * np.cos(2*np.pi*t)
t1 = np.arange(0.0, 5.0, 0.1)
t2 = np.arange(0.0, 5.0, 0.02)
fig, axs = plt.subplots(2, dpi=100)
#fig为matplotlib.figure.Figure对象的实例figure
#axs为matplotlib.axes.Axes对象实例(每个子图)组成的numpy.ndarray
axs[0].plot(t1, f(t1), color='tab:blue', marker='o')
axs[0].plot(t2, f(t2), color='black')
#两种设置标题的方法
#axs[0].set_title('haha')#使用matplotlib.axes.Axes的set_title方法设置小标题
axs[0].set(title='demo1')
axs[1].plot(t2, np.cos(2*np.pi*t2), color='tab:orange', linestyle='--')
fig.suptitle('matplotlib object-oriented')#使用matplotlib.figure.Figure中的suptitle方法设置Figure标题
plt.show()
欢迎随缘关注@pythonic生物人