# matplotlibç¬è®°ï¼åºäº matplotlib 1.5.1 ï¼ ## ä¸ãmatplotlibé ç½® matplotlibé ç½®ä¿¡æ¯æ¯ä»é ç½®æä»¶ä¸è¯»åçãå¨é ç½®æä»¶ä¸å¯ä»¥ä¸ºmatplotlibå 乿æç屿§æå®æ°¸ä¹ ææçé»è®¤å¼ã ### 1. æ¥çé ç½® ä½ å¯ä»¥éè¿ `matplotlib.rcParams`åå ¸è®¿é®ææå·²ç»å è½½çé 置项  ### 2. ä¿®æ¹é ç½® - ä½ å¯ä»¥éè¿ `matplotlib.rcParams`åå ¸ä¿®æ¹ææå·²ç»å è½½çé 置项  - ä½ å¯ä»¥éè¿`matplotlib.rc(*args,**kwargs)`æ¥ä¿®æ¹é 置项ï¼å ¶ä¸`args` æ¯ä½ è¦ä¿®æ¹ç屿§ï¼`kwargs`æ¯å±æ§çå ³é®å屿§  - ä½ å¯ä»¥è°ç¨`matplotlib.rcdefaults()`å°ææé ç½®é置为æ å设置ã  ### 3. é ç½®æä»¶ 妿ä¸å¸æå¨æ¯æ¬¡ä»£ç å¼å§æ¶è¿è¡åæ°é ç½®ï¼åå¯ä»¥å¨é¡¹ç®ä¸ç»åºé ç½®æä»¶ãé ç½®æä»¶æä¸ä¸ªä½ç½®ï¼ - ç³»ç»çº§é ç½®æä»¶ãé常å¨pythonç`site-packages`ç®å½ä¸ãæ¯æ¬¡éè£ `matplotlib`ä¹å该é ç½®æä»¶å°±ä¼è¢«è¦çã - ç¨æ·çº§é ç½®æä»¶ãé常å¨`$HOME`ç®å½ä¸ãå¯ä»¥ç¨`matplotlib.get_configdir()`å½ä»¤æ¥æ¥æ¾å½åç¨æ·çé ç½®æä»¶ç®å½ã  - å½åå·¥ä½ç®å½ãå³é¡¹ç®çç®å½ãå¨å½åç®å½ä¸ï¼å¯ä»¥ä¸ºç®å½æå å«çå½å项ç®ç»åºé ç½®æä»¶ï¼æä»¶å为`matplotlibrc`ã é ç½®æä»¶çå 容常è§çæä»¥ä¸å ç§ï¼ - axes:è®¾ç½®åæ è½´è¾¹çå表é¢çé¢è²ãåæ å»åº¦å¼å¤§å°åç½æ ¼çæ¾ç¤º - backendï¼è®¾ç½®ç®æ è¾åºTkAggåGTKAgg - figure:æ§å¶dpiãè¾¹çé¢è²ãå¾å大å°åååº(`subplot`)设置 - fontï¼åä½(`font family`)ãåä½å¤§å°åæ ·å¼è®¾ç½® - grid:è®¾ç½®ç½æ ¼é¢è²å线å - legendï¼è®¾ç½®å¾ä¾ä»¥åå ¶ä¸çææ¬æ¾ç¤º - lineï¼è®¾ç½®çº¿æ¡ï¼é¢è²ã线åã宽度çï¼åæ è®° - patch: å¡«å 2D空é´çå¾å½¢å¾åï¼å¦å¤è¾¹å½¢ååãæ§å¶çº¿å®½ãé¢è²åæé¯é½¿è®¾ç½®çã - savefig:对ä¿åçå¾å½¢è¿è¡åç¬è®¾ç½®ã妿¸²æçæä»¶èæ¯ä¸ºç½è²ã - textï¼è®¾ç½®åä½é¢è²ãææ¬è§£æï¼çº¯ææ¬ålatexæ è®°ï¼çã - verbose:设置matplotlibæ§è¡æé´çä¿¡æ¯è¾åºï¼å¦silentãhelpfulãdebugådebug--annoying - xticksåyticksï¼ä¸ºxãyè½´ç主å»åº¦å次å»åº¦è®¾ç½®é¢è²ã大å°ãæ¹åä»¥åæ ç¾å¤§å° ## äºã matplotlib Artist `matplotlib`æä¸ä¸ªå±æ¬¡çAPIï¼ - `matplotlib.backend_bases.FigureCanvas`ï¼ä»£è¡¨äºä¸ä¸ªç»å¾åºï¼å¨è¿ä¸ªç»å¾åºä¸å¾è¡¨è¢«ç»å¶ - `matplotlib.backend_bases.Renderer`ï¼ä»£è¡¨äºæ¸²æå¨ï¼å®ç¥éå¦ä½å¨ç»å¾åºä¸ç»å¾ã - `matplotlib.artist.Artist`ï¼ä»£è¡¨äºå¾è¡¨ç»ä»¶ï¼å®ç¥éå¦ä½å©ç¨æ¸²æå¨å¨ç»å¾åºä¸ç»å¾ã é常ç¨äºæ95%以ä¸çæ¶æºé½æ¯ä¸`matplotlib.artist.Artist`ç±»æäº¤éï¼å®æ¯é«å±æ¬¡çç»å¾æ§å¶ã `matplotlib`䏿䏤ç§`Artist`ï¼ - `primitive`ï¼ä»£è¡¨äºæä»¬å¨ç»å¾åºåä¸ç»å¶çåºç¡çç»å¾ç»ä»¶ï¼æ¯å¦`Line2D`ï¼`Rectangle`ï¼`Text` 以å`AxesImage`ççã - `container`ï¼ä»£è¡¨äºæ¾ç½®`primitive`çé£äºç»å¾ç»ä»¶ãæ¯å¦`Axis`ã`Axes`以å`Figure`ï¼å¦å¾æç¤º  `matplotlib`çæ åä½¿ç¨æµç¨ä¸ºï¼ - å建ä¸ä¸ª`Figure`å®ä¾å¯¹è±¡`fig` - 使ç¨`fig`å®ä¾å建ä¸ä¸ªæè å¤ä¸ª`Axes`å®ä¾ï¼æè å建ä¸ä¸ªæè å¤ä¸ª`Subplot`å®ä¾ - 使ç¨`Axes`å®ä¾çæ¹æ³æ¥å建`primitive` ### 1. Artistç屿§ æ¯ä¸ªå¨å¾å½¢ä¸åºç°çå ç´ é½æ¯`Artist` - `Figure.patch`屿§ï¼æ¯ä¸ä¸ª`Rectangle`ï¼ä»£è¡¨äºå¾è¡¨çç©å½¢æ¡ï¼å®ç大å°å°±æ¯å¾è¡¨ç大å°ï¼ å¹¶ä¸å¯ä»¥éè¿å®è®¾ç½®å¾è¡¨çèæ¯è²åéæåº¦ã - `Axes.patch`屿§ï¼ä¹æ¯ä¸ä¸ª`Rectangle`ï¼ä»£è¡¨äºç»å¾åæ è½´å é¨çç©å½¢æ¡ï¼ç½åºé»è¾¹ï¼ï¼ éè¿å®å¯ä»¥è®¾ç½®`Axes`çé¢è²ãéæåº¦çã - ææç`Artist`æä¸å屿§ãï¼ - `.alpha`屿§ï¼éæåº¦ãå¼ä¸º0--1ä¹é´çæµ®ç¹æ° - `.animated`屿§ï¼ä¸ä¸ªå¸å°å¼ï¼è¡¨ç¤ºæ¯å¦ç¨äºå éå¨ç»ç»å¶ - `.axes`屿§ï¼è¿åè¿ä¸ª`Artist`æå±ç`axes`ï¼å¯è½ä¸º`None` - `clip_box`屿§ï¼ç¨äºåªå`Artist`ç`bounding box` - `clip_on`屿§ï¼æ¯å¦å¼å¯`clip` - `clip_path`屿§ï¼`Artist`沿ç该`path`æ§è¡`clip` - `contains`屿§ï¼ä¸ä¸ª`picking function`ç¨äºæµè¯`Artist`æ¯å¦å å«`pick point` - `figure`屿§ï¼è¯¥`Artist`æå±ç`Figure`ï¼å¯è½ä¸º`None` - `gid`屿§ï¼è¯¥`Artist`ç`id`å符串 - `label`ï¼ä¸ä¸ª`text label` - `picker`:ä¸ä¸ª`python object`ç¨äºæ§å¶`object picking` - `transform`ï¼è½¬æ¢ç©éµ - `.url`屿§ï¼ä¸ä¸ª`url string`ï¼ä»£è¡¨æ¬`Artist` - `visible`ï¼å¸å°å¼ï¼æ§å¶`Artist`æ¯å¦ç»å¶ - `zorder`ï¼å³å®äº`Artist`çç»å¶é¡ºåºã`zorder`è¶å°å°±è¶åºå±ï¼åè¶ä¼å ç»å¶ã >è¿äºå±æ§å¯ä»¥éè¿æ§å¼ç`setter`å`getter`彿°è®¿é®å设置ãå¦ï¼ > > - `o.get_alpha()`ã`o.set_alpha(0.5)` > - å¦æä½ æ³ä¸æ¬¡è®¾ç½®å¤ä¸ªå±æ§ï¼ä¹å¯ä»¥ç¨ï¼`o.set(alpha=0.5,zorder=2)`è¿ç§æ¹å¼ > - ä½ å¯ä»¥ä½¿ç¨`matplotlib.artist.getp(o)`æ¥ä¸æ¬¡è·å`o`çææå±æ§ >  ### 2. container Artist: #### a. Figure `matplotlib.figure.Figure`æ¯æé¡¶å±ç`container Artist`ï¼å®å å«äºå¾è¡¨ä¸çææå ç´ ã - `Figure.patch`屿§ï¼`Figure`çèæ¯ç©å½¢ - `Figure.axes`屿§ï¼ææçä¸ä¸ª`Axes`å®ä¾çå表ï¼å æ¬`Subplot`) - `Figure.images`屿§ï¼ææçä¸ä¸ª`FigureImages patch`å表 - `Figure.lines`屿§ï¼ææä¸ä¸ª`Line2D`å®ä¾çå表ï¼å¾å°ä½¿ç¨ï¼ - `Figure.legends`屿§ï¼ææçä¸ä¸ª`Figure Legend`å®ä¾å表ï¼ä¸åäº`Axes.legends`) - `Figure.patches`屿§ï¼ææçä¸ä¸ª`Figure pathes`å®ä¾å表ï¼å¾å°ä½¿ç¨) - `Figure.texts`屿§ï¼ææç`Figure Text`å®ä¾å表 ##### 1> Figure ç Axes å½ä½ æ§è¡`Figure.add_subplot()`æè `Figure.add_axes()`æ¶ï¼è¿äºæ°å»ºç`Axes`é½è¢«æ·»å å°`Figure.axes`å表ä¸ã ç±äº`Figure`ç»´æäº`current axes`ï¼å æ¤ä½ ä¸åºè¯¥æå¨çä»`Figure.axes`åè¡¨ä¸æ·»å å é¤å ç´ ï¼èæ¯è¦éè¿`Figure.add_subplot()`ã`Figure.add_axes()`æ¥æ·»å å ç´ ï¼éè¿`Figure.delaxes()`æ¥å é¤å ç´ ã使¯ä½ å¯ä»¥è¿ä»£æè 访é®`Figure.axes`ä¸ç`Axes`ï¼ç¶åä¿®æ¹è¿ä¸ª`Axes`ç屿§ã å¯ä»¥éè¿`Figure.gca()`è·å`current axes`ï¼éè¿`Figure.sca()`设置`current axes`ã ##### 2> Figure ç primitive `Figure`乿å®èªå·±ç`text`ã`line`ã`patch`ã`image`ãä½ å¯ä»¥ç´æ¥éè¿`add primitive`è¯å¥ç´æ¥æ·»å ã使¯æ³¨æ`Figure`é»è®¤çåæ ç³»æ¯ä»¥åç´ ä¸ºåä½ï¼ä½ å¯è½éè¦è½¬æ¢æ`figure`åæ ç³»ï¼(0,0)表示左ä¸ç¹ï¼(1,1)表示å³ä¸ç¹ã  #### b. Axesç±» `Axes`ç±»æ¯`matplotlib`çæ ¸å¿ï¼ä½ å¨å¤§å¤æ°æ¶é´é½æ¯å¨ä¸å®æäº¤éã`Axes`代表äº`plotting area`ã大éçç¨äºç»å¾ç`Artist`åæ¾å¨å®å é¨ï¼å¹¶ä¸å®æè®¸å¤è¾ 婿¹æ³æ¥åå»ºåæ·»å `Artist`ç»å®èªå·±ï¼èä¸å®ä¹æè®¸å¤èµå¼æ¹æ³æ¥è®¿é®åä¿®æ¹è¿äº`Artist`ã å®æè®¸å¤æ¹æ³ç¨äºç»å¾ï¼å¦`.plot()`ã`.text()`ã`.hist()`ã`.imshow()`çæ¹æ³ç¨äºåå»ºå¤§å¤æ°å¸¸è§ç`primitive`(å¦`Line2D`ï¼`Rectangle`ï¼`Text`ï¼`Image`ççï¼ãè¿äºæ¹æ³ä¼å建`primitive Artist`å®ä¾ï¼å¹¶ä¸æ·»å è¿äºå®ä¾å°å¯¹åºç`container`ä¸å»ï¼ç¶åå¿ è¦çæ¶åä¼ç»å¶è¿äºå¾å½¢ã `Subplot`å°±æ¯ä¸ä¸ªç¹æ®ç`Axes`ï¼å ¶å®ä¾æ¯ä½äºç½æ ¼ä¸æä¸ªåºåç`Subplot`å®ä¾ãå ¶å®ä½ ä¹å¯ä»¥å¨ä»»æåºåå建`Axes`ï¼éè¿`Figure.add_axes([left,bottom,width,height])`æ¥å建ä¸ä¸ªä»»æåºåç`Axes`ï¼å ¶ä¸`left,bottom,width,height`齿¯[0--1]ä¹é´çæµ®ç¹æ°ï¼ä»ä»¬ä»£è¡¨äºç¸å¯¹äº`Figure`çåæ ã  ##### 1> .patch 屿§ `Axes`å å«äºä¸ä¸ª`.patch`屿§ï¼å¯¹äºå¡è¿ªå°åæ ç³»èè¨ï¼å®æ¯ä¸ä¸ª`Rectangle`ï¼å¯¹äºæåæ èè¨ï¼å®æ¯ä¸ä¸ª`Circle`ãè¿ä¸ª`.patch`屿§å³å®äº`plotting region`çå½¢ç¶ãèæ¯åè¾¹æ¡ã  ##### 2> 常ç¨ç»å¾æ¹æ³ å½è°ç¨`Axes.plot()`æ¹æ³æ¶ï¼è¯¥æ¹æ³ä¼å建ä¸ä¸ª`matplotlib.lines.Line2D`å®ä¾ï¼ç¶åä¼å©ç¨ä¼ ç»`.plot()`çå ³é®ååæ°æ¥æ´æ°è¯¥`Line2D`ç屿§ï¼ç¶åå°è¿ä¸ª`Line2D`æ·»å å°`Axes.lines`å表ä¸ãè¯¥æ¹æ³è¿åçåå建ç`Line2D`å表ï¼å ä¸ºä½ å¯ä»¥ä¼ éå¤ä¸ª`(x,y)`å¼ä»èå建å¤ä¸ª`Line2D`ã å½è°ç¨`Axes.hist()`æ¹æ³æ¶ï¼ç±»ä¼¼äº`.plot()`æ¹æ³ï¼ä¸è¿å®ä¼æ·»å `patches`å°`Axes.patches`å表ã  ä½ ä¸åºè¯¥ç´æ¥éè¿`Axes.lines`å`Axes.patches`åè¡¨æ¥æ·»å å¾è¡¨ãå 为å½ä½ éè¿`.plot()`å`.hist()`çæ¹æ³æ·»å å¾è¡¨æ¶ï¼`matplotlib`ä¼å许å¤å·¥ä½èä¸ä» ä» æ¯æ·»å ç»å¾ç»ä»¶å°`Axes.lines`æè `Axes.patches`å表ä¸ã 使¯ä½ å¯ä»¥ä½¿ç¨`Axes`çè¾ å©æ¹æ³`.add_line()`å`.add_patch()`æ¹æ³æ¥æ·»å ã  ##### 3> å¸¸ç¨ Axes æ¹æ³ ä¸é¢æ¯`Axes`ç¨äºå建`primitive Artist`以忷»å ä»ä»¬å°ç¸åºç`container`ä¸çæ¹æ³ï¼ - `ax.annotate()`ï¼å建`text annotation`ï¼`Annotate`对象ï¼ï¼ç¶åæ·»å å°`ax.texts`å表ä¸ã - `ax.bar()`ï¼å建`bar chart`ï¼`Rectangle`对象ï¼ï¼ç¶åæ·»å å°`ax.patches`å表ä¸ã - `ax.errorbar()`ï¼å建`error bar plot`ï¼`Line2D`对象å`Rectangle`对象ï¼ï¼ç¶åæ·»å å°`ax.lines` å表ä¸å`ax.patches`å表ä¸ã - `ax.fill()`ï¼å建`shared area`ï¼`Polygon`对象ï¼ï¼ç¶åæ·»å å°`ax.patches`åè¡¨ä¸ - `ax.hist()`ï¼å建`histogram`ï¼`Rectangle`对象ï¼ï¼ç¶åæ·»å å°`ax.patches`å表ä¸ã - `ax.imshow()`ï¼å建`image data`ï¼`AxesImage`对象ï¼ï¼ç¶åæ·»å å°`ax.images`å表ä¸ã - `ax.legend()`ï¼å建`axes legends`ï¼`Legend`对象ï¼ï¼ç¶åæ·»å å°`ax.legends`å表ä¸ã - `ax.plot()`ï¼å建`xy plot`ï¼`Line2D`对象ï¼ï¼ç¶åæ·»å å°`ax.lines`å表ä¸ã - `ax.scatter()`ï¼å建`scatter charts`ï¼`PolygonCollection`对象ï¼ï¼ç¶åæ·»å å° `ax.collections`å表ä¸ã - `ax.text()`ï¼å建`text`ï¼`Text`对象ï¼ï¼ç¶åæ·»å å°`ax.texts`å表ä¸ã ##### 4> Axes çåæ è½´ å¦å¤`Axes`è¿å å«ä¸¤ä¸ªæéè¦ç`Artist container`ï¼ - `ax.xaxis`ï¼`XAxis`对象çå®ä¾ï¼ç¨äºå¤ç`x`è½´`tick`以å`label`çç»å¶ - `ax.yaxis`ï¼`YAxis`对象çå®ä¾ï¼ç¨äºå¤ç`y`è½´`tick`以å`label`çç»å¶ `Axes`å å«äºè®¸å¤è¾ 婿¹æ³æ¥è®¿é®åä¿®æ¹`XAxis`å`YAxis`ï¼è¿äºè¾ 婿¹æ³å ¶å®å é¨è°ç¨çæ¯`XAxis`å`YAxis`çæ¹æ³ãå æ¤é常æ åµä¸ä½ ä¸éè¦ç´æ¥è°ç¨`XAxis`å`YAxis`çæ¹æ³ã  #### c. Axisç±» `matplotlib.axis.Axis`å®ä¾å¤ç`tick line`ã`grid line`ã`tick label`以å`axis label`çç»å¶ãéå¸¸ä½ å¯ä»¥ç¬ç«çé ç½®`y`è½´ç左边`tick`以åå³è¾¹ç`tick`ï¼ä¹å¯ä»¥ç¬ç«å°é ç½®`x`è½´çä¸è¾¹`tick`以åä¸è¾¹ç`tick`ã `Axis`ä¹åå¨äºæ°æ®ç¨äºå é¨ç缩æ¾ä»¥åèªéåºå¤çãå®è¿æ`Locator`å®ä¾å`Formatter`å®ä¾ç¨äºæ§å¶`tick`ææ¾çä½ç½®ä»¥å`tick`çæ æ³¨åç¬¦ä¸²ã æ¯ä¸ª`Axis`齿ä¸ä¸ª`.label`屿§ï¼ä¹æ`major tick`å表å`minor tick`å表ãè¿äº`tick`æ¯`XTick`å`YTick`çå®ä¾ï¼ä»ä»¬åæ¾çå®é ç`line primitive`以å`text primitive`æ¥æ¸²æ`tick`以å`ticklabel`ã `tick`æ¯å¨æå建çï¼åªæå¨éè¦åå»ºçæ¶åæåå»ºï¼æ¯å¦ç¼©æ¾çæ¶åï¼ã`Axis`乿ä¾äºä¸äºè¾ 婿¹æ³æ¥è·å`tick label`ã`tick location`ççï¼ - `Axis.get_major_ticks()`ï¼è·å`major tick`å表ï¼ä¸ä¸ª`Tick`对象çåè¡¨ï¼ - `Axis.get_minor_ticks()`ï¼è·å`minor tick`å表ï¼ä¸ä¸ª`Tick`对象çåè¡¨ï¼ - `Axis.get_ticklocs()`ï¼è·å`tick location`å表ã å¯ä»¥éè¿`minor=True|False`å ³é®ååæ°æ§å¶è¾åº`minor`è¿æ¯`major`ç`tick location`ã - `Axis.get_ticklabels()`ï¼è·å`tick label`å表(ä¸ä¸ª`Text`å®ä¾çå表ï¼ã å¯ä»¥éè¿`minor=True|False`å ³é®ååæ°æ§å¶è¾åº`minor`è¿æ¯`major`ç`tick label`ã - `Axis.get_ticklines()`ï¼è·å`tick line`å表(ä¸ä¸ª`Line2D`å®ä¾çå表ï¼ã å¯ä»¥éè¿`minor=True|False`å ³é®ååæ°æ§å¶è¾åº`minor`è¿æ¯`major`ç`tick line`ã - `Axis.get_scale()`ï¼è·ååæ è½´ç缩æ¾å±æ§ï¼å¦`'log'`æè `'linear'` - `Axis.get_view_interval()`:è·åå é¨ç`axis view limits`å®ä¾ - `Axis.get_data_interval()`:è·åå é¨ç`axis data limits`å®ä¾ - `Axis.get_gridlines()`:è·å`grid line`çå表 - `Axis.get_label()`:è·å`axis label`(ä¸ä¸ª`Text`å®ä¾) - `Axis.get_major_locator()`:è·å`major tick locator`(ä¸ä¸ª`matplotlib.ticker.Locator`å®ä¾) - `Axis.get_minor_locator()`:è·å`minor tick locator`(ä¸ä¸ª`matplotlib.ticker.Locator`å®ä¾) - `Axis.get_major_formatter()`:è·å`major tick formatter`(ä¸ä¸ª`matplotlib.ticker.Formatter`å®ä¾) - `Axis.get_minor_formatter()`:è·å`minor tick formatter`(ä¸ä¸ª`matplotlib.ticker.Formatter`å®ä¾) - `Axis.grid()`:ä¸ä¸ªå¼å ³ï¼ç¨äºæ§å¶`major`æè `minor`ç`tick`ç`on|off`  #### d. Tickç±» `matplotlib.axis.Tick`ç±»æ¯ä»`Figure`-->`Axes`-->`Tick`è¿ä¸ª`container`ä½ç³»ä¸ææ«ç«¯ç`container`ã`Tick`容纳äº`tick`ã`grid line`以å`tick`对åºç`label`ãææçè¿äºé½å¯ä»¥éè¿`Tick`ç屿§è·å: - `Tick.tick1line`ï¼ä¸ä¸ª`Line2D`å®ä¾ - `Tick.tick2line`ï¼ä¸ä¸ª`Line2D`å®ä¾ - `Tick.gridline`ï¼ä¸ä¸ª`Line2D`å®ä¾ - `Tick.label1`ï¼ä¸ä¸ª`Text`å®ä¾ - `Tick.label2`ï¼ä¸ä¸ª`Text`å®ä¾ - `Tick.gridOn`ï¼ä¸ä¸ªå¸å°å¼ï¼å³å®äºæ¯å¦ç»å¶`tickline` - `Tick.tick1On`ï¼ä¸ä¸ªå¸å°å¼ï¼å³å®äºæ¯å¦ç»å¶`1st tickline` - `Tick.tick2On`ï¼ä¸ä¸ªå¸å°å¼ï¼å³å®äºæ¯å¦ç»å¶`2nd tickline` - `Tick.label1On`ï¼ä¸ä¸ªå¸å°å¼ï¼å³å®äºæ¯å¦ç»å¶`1st tick label` - `Tick.label2On`ï¼ä¸ä¸ªå¸å°å¼ï¼å³å®äºæ¯å¦ç»å¶`2nd tick label` > `y`è½´å为左å³ä¸¤ä¸ªï¼å æ¤`tick1*`对åºå·¦ä¾§çè½´ï¼`tick2*`对åºå³ä¾§çè½´ã > `x`è½´å为ä¸ä¸ä¸¤ä¸ªï¼å æ¤`tick1*`对åºä¸ä¾§çè½´ï¼`tick2*`对åºä¸ä¾§çè½´ã  ### 3. primitive #### a. Line2Dç±» `matplotlib.lines.Line2D`ç±»æ¯`matplotlib`ä¸çæ²çº¿ç±»ï¼åºç±»æ¯`matplotlib.artist.Artist`ï¼ï¼å®å¯ä»¥æåç§åæ ·çé¢è²ãç±»åãä»¥åæ æ³¨ççãå®çæé 彿°ä¸ºï¼ ``` Line2D(xdata, ydata, linewidth=None, linestyle=None, color=None, marker=None, markersize=None, markeredgewidth =None, markeredgecolor=None, markerfacecolor =None, markerfacecoloralt=ânoneâ, fillstyle=None, antialiased=None, dash_capstyle=None, solid_capstyle=None, dash_joinstyle=None, solid_joinstyle=None, pickradius=5, drawstyle=None, markevery=None, **kwargs) ``` è¿äºå ³é®å忰齿¯`Line2D`ç屿§ãå ¶å±æ§æï¼ - ç»§æ¿èª`Artist`åºç±»ç屿§ï¼ `.alpha`ã`.animated`ã`.axes`ã`.clip_box`ã.`.clip_on`ã`.clip_path`ã`.contains`ã`.figure`ã`.gid`ã`.label`ã`.picker`ã`.transform`ã`.url`ã`.visible`ã`.zorder` - `.antialiased`æè `.aa`屿§ï¼ä¸ä¸ªå¸å°å¼ãå¦æä¸º`True`åè¡¨ç¤ºçº¿æ¡æ¯æé¯é½¿å¤çç - `.color`æè `.c`屿§ï¼ä¸ä¸ª`matplotlib color`å¼ï¼è¡¨ç¤ºçº¿æ¡çé¢è²ï¼ - `.dash_capstyle`屿§ï¼ä¸º`'butt' or 'round' or 'projecting'`ï¼è¡¨ç¤ºè线头端类å - `.dash_joinstyle`屿§ï¼ä¸º`'miter' or 'round' or 'bevel'`ï¼è¡¨ç¤ºèçº¿è¿æ¥å¤ç±»å - `.dashes`屿§ï¼ä¸ä¸ªæ°å¼åºåï¼è¡¨ç¤ºè线çå®é¨ãèé¨ç尺寸ãå¦æä¸º`(None,None)`åè线æä¸ºå®çº¿ - `.drawstyle`屿§ï¼ä¸º`'default'or'steps'or'step-pre'or'step-mid'or'step-post'`ï¼è¡¨ç¤ºæ²çº¿ç±»åã - `'default'`ï¼ç¹ä¹é´ä»¥ç´çº¿è¿æ¥ - `'steps*'`ï¼ç»å¶é¶æ¢¯å¾ãå ¶ä¸`steps`çä»·äº`steps-pre`ï¼æ¯ä¸ºäºä¿æå ¼å®¹æ§ä»£ç - `.fillstyle`屿§ï¼ä¸º`'full'or'left'or'right'or'bottom'or'top'or'none'`表示`marker`çå¡«å ç±»åã - `'full'`ï¼å¡«å æ´ä¸ª`marker` - `none`ï¼ä¸å¡«å `marker` - å ¶ä»å¼ï¼è¡¨ç¤ºå¡«å ä¸å`marker` - `.linestyle`æè `ls`屿§ï¼æå®çº¿åï¼å¯ä»¥ä¸ºä»¥ä¸å¼ï¼ - `'-'`æè `'solid'`ï¼è¡¨ç¤ºå®çº¿ - `'--'`æè `dashed`ï¼è¡¨ç¤ºè线 - `'-.'`æè `dash_dot`ï¼è¡¨ç¤ºç¹å线 - `':'`æè `'dotted'`ï¼è¡¨ç¤ºç¹çº¿ - `'None'`æè `' '`æè `''`ï¼è¡¨ç¤ºæ²¡æçº¿æ¡ï¼ä¸ç»çº¿ï¼ - `.linewidth`æè `lw`屿§ï¼ä¸ºæµ®ç¹å¼ï¼è¡¨ç¤ºçº¿æ¡å®½åº¦ - `.marker`屿§ï¼å¯ä»¥ä¸ºä¸ç³»åçå符串ï¼å¦`'.'ã','ã'o'....`,表示线æ¡ç`marker` - `.markeredgecolor`æè `.mec`屿§:å¯ä»¥ä¸º`matplotlib color`ï¼è¡¨ç¤º`marker`çè¾¹çé¢è² - `.markeredgewidth`æè `.mew`屿§:å¯ä»¥ä¸ºæµ®ç¹æ°ï¼è¡¨ç¤º`marker`è¾¹ç宽度 - `.markerfacecolor`æè `.mfc`屿§ï¼å¯ä»¥ä¸º`matplotlib color`ï¼è¡¨ç¤º`marker`çåæ¯è² - `.markerfacecoloralt`æè `.mfcalt`屿§ï¼å¯ä»¥ä¸º`matplotlib color`ï¼è¡¨ç¤º`marker`çå¯éåæ¯è² - `.markersize`æè `.ms`屿§ï¼å¯ä»¥ä¸ºæµ®ç¹æ°ï¼è¡¨ç¤º`marker`çå¤§å° - `.markevery`屿§ï¼æå®æ¯éå¤å°ä¸ªç¹ç»å¶ä¸ä¸ª`marker`ï¼å¯ä»¥ä¸ºä»¥ä¸å¼ï¼ - `None`ï¼è¡¨ç¤ºæ¯ä¸ªç¹é½ç»å¶`marker` - `N`ï¼è¡¨ç¤ºæ¯é`N`个ç¹ç»å¶`marker`ï¼ä»0å¼å§ - `(start,N)`ï¼è¡¨ç¤ºæ¯é`N`个ç¹ç»å¶`marker`ï¼ä»`start`å¼å§ - `[i,j,m,n]`ï¼åªæç¹`i,j,m,n`ç`marker`ç»å¶ - ...å ¶ä»å¼åèææ¡£ - `.pickradius`屿§ï¼æµ®ç¹å¼ï¼è¡¨ç¤º`pick radius` - `.solid_capstyle`屿§ï¼å¯ä»¥ä¸º`'butt'ã'round'ã'projecting'`ï¼è¡¨ç¤ºå®çº¿ç头端类å - `.sold_joinstyle`屿§ï¼å¯ä»¥ä¸º`'miter'ã'round'ã'bevel'`ï¼è¡¨ç¤ºå®çº¿è¿æ¥å¤çç±»å - `.xdata`屿§ï¼å¯ä»¥ä¸ºä¸ç»´ç`numpy.array`ï¼è¡¨ç¤º`x`è½´æ°æ® - `.ydata`屿§ï¼å¯ä»¥ä¸ºä¸ç»´ç`numpy.array`ï¼è¡¨ç¤º`y`è½´æ°æ® #### b. Textç±» `matplotlib.text.Text`ç±»æ¯ç»å¶æåçç±»ï¼åºç±»æ¯`matplotlib.artist.Artist`ï¼ãå®çæé 彿°ä¸ºï¼ ``` Text(x=0, y=0, text='', color=None, verticalalignment='baseline', horizontalalignment=âleftâ, multialignment=None, fontproperties =None, rotation=None, linespacing=None, rotation_ mode=None, usetex=None, wrap=False, **kwargs) ``` è¿äºå ³é®å忰乿¯å±æ§ãå ¶å±æ§æï¼ - ç»§æ¿èª`Artist`åºç±»ç屿§ï¼ `.alpha`ã`.animated`ã`.axes`ã`.clip_box`ã.`.clip_on`ã`.clip_path`ã`.contains`ã`.figure`ã`.gid`ã`.label`ã`.picker`ã`.transform`ã`.url`ã`.visible`ã`.zorder` - `.backgroundcolor`屿§ï¼èæ¯è²ï¼å¯ä»¥ä¸ºä»»ä½`matplotlib color` - `.bbox`屿§ï¼ææ¬æ¡çè¾¹æ¡ãå ¶å¼æ¯`FancyBboxPatch`ç±»ç屿§åå ¸ã - `.color`屿§ï¼åä½é¢è²ï¼å¯ä»¥ä¸ºä»»ä½`matplotlib color` - `.family`æè `.name`æè `.fontfamily`æè `.fontname`屿§ï¼åä½çååãå¯ä»¥æ¯`string`æè `string list`ï¼è¡¨ç¤ºå¯ä»¥ä¸ºè¥å¹²ä¸ªååï¼ä¼å çº§ä¾æ¬¡éåï¼ã`string`å¿ é¡»æ¯ä¸ä¸ªçå®åä½çååï¼æè ä¸ä¸ªåä½ç`class name`ã - `.fontproperties`æè `.font_properties`屿§ï¼åä½ç屿§ï¼å¼æ¯ä¸ä¸ª`matplotlib.font_manager.FontProperties`å®ä¾ï¼è¯¥å®ä¾ä¸æ¬¡æ§è®¾ç½®åä½çå¾å¤å±æ§ï¼æ¯å¦åä½ç±»åãåä½ååãåä½å¤§å°ã宽度ã...ï¼ - `.horizontalalignment`æè `.ha`屿§ï¼æ°´å¹³å¯¹é½æ¹å¼ï¼å¯ä»¥ä¸º`'center'ã'right'ã'left'` - `.linespacing`屿§ï¼ä¸ºæµ®ç¹æ°ï¼åä½ä¸º`font size`ï¼è¡¨ç¤ºè¡é´è· - `.multialignment`屿§ï¼`multiline text`坹齿¹å¼ï¼å¯ä»¥ä¸º`'left'ã'right'ã'center'` - `.position`屿§ï¼ä¸ºä¸ä¸ªå ç»`(x,y)`ï¼è¡¨ç¤ºææ¬æ¡çä½ç½® - `.rotation`屿§ï¼åä½æè½¬è§åº¦ãå¯ä»¥ä¸ºä¸åå¼ï¼ - æµ®ç¹æ°ï¼è¡¨ç¤ºè§åº¦ - `'vertical'ã'horizontal'` - `.rotation_mode`屿§ï¼æè½¬æ¨¡å¼ãå¯ä»¥ä¸ºä¸åå¼ï¼ - `'anchor'`ï¼ææ¬é¦å 对é½ï¼ç¶åæ ¹æ®å¯¹é½ç¹æ¥æè½¬ - `None`ï¼ææ¬å æè½¬ï¼åå¯¹é½ - `.size`æè `.fontsize`屿§ï¼åä½å¤§å°ãå¯ä»¥ä¸ºä¸åå¼ï¼ - æµ®ç¹å¼ï¼è¡¨ç¤ºåä½å¤§å° - `'xx-small'ã'x-small'ã'small'ã'medium'ã'large'ã'x-large'ã'xx-large'` - `.stretch`æè `.fontstretch`屿§ï¼å使²¿æ°´å¹³æ¹åçæä¼¸ãå¯ä»¥ä¸ºä¸åå¼ï¼ - æ´æ°ï¼å¨[0---1000]ä¹é´ - `'ultra-condensed'ã'extra-condensed'ã'condensed'ã'semi-condensed'ã'normal'ã'semi-expanded'ã'expanded'ã'extra-expanded'ã'ultra-expanded'` - `.style`æè `.fontstyle`屿§ï¼å使 ·å¼ï¼å¯ä»¥ä¸º`'normal'ã'italic'ã'oblique'` - `.text`屿§:ææ¬å符串ï¼å¯ä»¥ä¸ºä»»æå符串ï¼ä»å¯ä»¥å å«`'\n'`æ¢è¡ç¬¦æè `LATEX`è¯æ³ï¼ - `.variant`æè `.fontvariant`屿§ï¼è¡¨ç¤ºåä½å½¢åï¼å¯ä»¥ä¸ºä¸åå¼ï¼`'normal'ã'small-caps'` - `.verticalalignment`æè `.ma`æè `.va`屿§ï¼è¡¨ç¤ºææ¬çåç´å¯¹é½ï¼å¯ä»¥ä¸ºä¸åå¼ï¼ - `'center'ã'top'ã'bottom'ã'baseline'` - `.weight`æè `.fontweight`屿§ï¼è®¾ç½®åä½ç`weight`ï¼å¯ä»¥ä¸ºä¸åå¼ï¼ - ä¸ä¸ªæ´æ°å¼ï¼å¨[0---1000]ä¹é´ - `'ultralight'ã'light'ã'normal'ã'regular'ã'book'ã'medium'ã 'roman'ã'semibold'ã'demibold'ã'demi'ã'bold'ã'heavy'ã 'extrabold'ã'black'` - `.x`屿§ï¼ä¸ä¸ªæµ®ç¹å¼ï¼è¡¨ç¤ºææ¬æ¡ä½ç½®ç`x`å¼ - `.y`屿§ï¼ä¸ä¸ªæµ®ç¹å¼ï¼è¡¨ç¤ºææ¬æ¡ä½ç½®ç`y`å¼ #### c. Annotationç±» `matplotlib.text.Annotation`ç±»æ¯å¾è¡¨ä¸çå¾å¼ï¼å®æ¯ä¸ä¸ªå¸¦ç®å¤´çææ¬æ¡ï¼ç¨äºè§£è¯´å¾è¡¨ä¸çå¾å½¢ãå®çåºç±»æ¯`matplotlib.text.Text`å` matplotlib.text._AnnotationBase`ãå ¶æé 彿°ä¸ºï¼ ``` Annotation(s, xy, xytext=None, xycoords=âdataâ, textcoords=None, arrowprops =None, annotation_clip=None, **kwargs) ``` å¨ä½ç½®`xytext`夿¾ç½®ä¸ä¸ªææ¬æ¡ï¼è¯¥ææ¬æ¡ç¨äºè§£éç¹`xy`ï¼ææ¬æ¡çææ¬ä¸º`s`ã - `s`ï¼ææ¬æ¡çææ¬å符串 - `xy`ï¼è¢«è§£éçç¹çåæ - `xytext`ï¼ææ¬æ¡æ¾ç½®çä½ç½®ãå¦æä¸º`None`ï¼åé»è®¤å`xy` - `xycoords`ï¼`xy`åæ ç³»ï¼é»è®¤å`'data'`åæ ç³»ï¼å³`xy`æ¯æ°æ®åæ ç³»ä¸çç¹ï¼ãå¯ä»¥ä¸ºä»¥ä¸å¼ï¼ - `'figure points'`ï¼ä»`figure`å·¦ä¸è§å¼å§çç¹ - `'figure pixesl'`ï¼ä»`figure`å·¦ä¸è§å¼å§çåç´ å¼ - `'figure fraction'`ï¼`(0,0)`代表`figure`çå·¦ä¸è§ï¼`(1,1)`代表`figure`çå³ä¸è§ - `'axes points'`ï¼ä»`axes`å·¦ä¸è§å¼å§çç¹ - `'axes pixels'`ï¼ä»`axes`å·¦ä¸è§å¼å§çåç´ - `'axes fraction'`ï¼`(0,0)`代表`axes`çå·¦ä¸è§ï¼`(1,1)`代表`axes`çå³ä¸è§ - `'data'`ï¼ä½¿ç¨è¢«æ 注对象çåæ ç³» - `'offset points'`ï¼æå®ä»`xy`ç便å®ç¹ - `'polar'`ï¼æåæ ç³» - `textcoords`ï¼ææ¬æ¡åæ ç³»ï¼å³`xytext`æ¯ææ¬åæ ç³»ä¸çç¹ï¼ï¼é»è®¤çäº`xycoords` - `arrowprops`ï¼æå®ææ¬æ¡å被解éçç¹ä¹é´çç®å¤´ã妿䏿¯`None`ï¼åæ¯ä¸ä¸ªåå ¸ï¼è¯¥åå ¸è®¾å®äº`matplotlib.lines.Line2D`ç屿§ã - å¦æè¯¥åå ¸æä¸ä¸ª`arrowstyle`屿§ï¼å该é®å¯¹åºçå¼ä¹æ¯ä¸ä¸ªåå ¸ï¼å建ä¸ä¸ª`FancyArrowsPatch`å®ä¾ï¼ å®ä¾å±æ§ç±è¯¥åå ¸æå®ã - å¦æè¯¥åå ¸æ²¡æ`arrowstyle`屿§ï¼åå建ä¸ä¸ª`YAArrow`å®ä¾ï¼ - `annotation_clip`ï¼æ§å¶è¶ åº`axes`åºåç`annotation`çæ¾ç¤ºãå¦æä¸º`True`å`annotation` åªæ¾ç¤ºä½äº`axes`åºåå çå 容ã - é¢å¤çå ³é®ååæ°å ¨é¨æ¯è®¾ç½®`Text`ç屿§ #### d. Legend `matplotlib.legend.Legend`æ¯å¾ä¾ç±»ï¼å®çåºç±»æ¯`matplotlib.artist.Artist`ãå ¶æé 彿°ä¸ºï¼ ``` Legend(parent, handles, labels, loc=None, numpoints=None, markerscale =None, markerfirst=True, scatterpoints=None, scatteryosets=None, prop=None, fontsize=None, borderpad =None, labelspacing=None, handlelength=None, handleheight=None, handletextpad=None, borderaxespad =None, columnspacing=None, ncol=1, mode=None, fancybox=None, shadow=None, title=None, framealpha =None, bbox_to_anchor=None, bbox_transform=None, frameon=None, handler_map=None) ``` å ¶å ³é®ååæ°ä¸ºï¼ - `parent`ï¼ææè¯¥`legend`ç`artist` - `loc`:å¾ä¾çä½ç½®ãå ¶å¼å¯ä»¥ä¸ºå符串æè æ°åï¼ - `best`æ0ï¼èªå¨è®¡ç® - `upper right`æ1ï¼ å³ä¸è§ - `upper left`æ2ï¼ä¸è§ - `lower left`æ3ï¼ä¸è§ - `lower right`æ4ï¼å³ä¸è§ - `right`æ5ï¼å³è¾¹ - `center left`æ6ï¼ä¸é´åå·¦ - `center right`æ7ï¼ä¸é´åå³ - `lower center`æ8ï¼ä¸é´åºé¨ - `upper center`æ9ï¼ä¸é´é¡¶é¨ - `center`æ10ï¼æ£ä¸å¤® - `handle`ï¼ä¸ä¸ª`artist`åè¡¨ï¼æ·»å è¿äº`artist`å°`legend`ä¸ - `lebels`ï¼ä¸ä¸ªå符串å表添å å°`legend`ä¸ - `prop`:åä½å±æ§ - `fontsize`: åä½å¤§å°ï¼åªæ`prop`æªè®¾ç½®æ¶ææï¼ - `markerscale`: `marker`çç¼©æ¾æ¯ä¾ï¼ç¸å¯¹äºåå§å¤§å°ï¼ - `markerfirst`: å¦æä¸º`True`ï¼å`marker`æ¾å¨`label`左侧ï¼å¦å`marker`æ¾å¨`label`å³ä¾§ - `numpoints`: the number of points in the legend for line - `scatterpoints`: the number of points in the legend for scatter plot - `scatteryosets`: a list of yosets for scatter symbols in legend - `frameon`: if True, draw a frame around the legend. If None, use rc - `fancybox`: if True, draw a frame with a round fancybox. If None, use rc - `shadow`: if True, draw a shadow behind legend - `framealpha`: If not None, alpha channel for the frame. - `ncol`: number of columns - `borderpad`: the fractional whitespace inside the legend border - `labelspacing`: the vertical space between the legend entries - `handlelength`: the length of the legend handles - `handleheight`: the height of the legend handles - `handletextpad`: the pad between the legend handle and text - `borderaxespad`: the pad between the axes and legend border - `columnspacing`:the spacing between columns - `title`: å¾ä¾çæ é¢ - `bbox_to_anchor`: the bbox that the legend will be anchored. - `bbox_transform`: the transform for the bbox. transAxes if Noneloc a location code - å ¶ä»å ³é®ååæ°ç¨äºè®¾ç½®å±æ§ 屿§ä¸ºï¼ - ç»§æ¿èª`Artist`åºç±»ç屿§ï¼ `.alpha`ã`.animated`ã`.axes`ã`.clip_box`ã.`.clip_on`ã`.clip_path`ã`.contains`ã`.figure`ã`.gid`ã`.label`ã`.picker`ã`.transform`ã`.url`ã`.visible`ã`.zorder` #### e. Patchç±» `matplotlib.patches.Patch`ç±»æ¯äºç»´å¾å½¢ç±»ãå®çåºç±»æ¯`matplotlib.artist.Artist`ãå ¶æé 彿°ä¸ºï¼ ``` Patch(edgecolor=None, facecolor=None, color=None, linewidth=None, linestyle=None, antialiased=None, hatch=None, fill=True, capstyle=None, joinstyle=None, **kwargs) ``` åæ°ä¸ºï¼ - `edgecolor`ï¼å¯ä»¥ä¸º`matplotlib color`ï¼è¡¨ç¤ºè¾¹çº¿æ¡çé¢è²ï¼è¥ä¸º`none`å表示æ é¢è² - `facecolor`ï¼å¯ä»¥ä¸º`matplotlib color`ï¼è¡¨ç¤ºåæ¯è²ï¼è¥ä¸º`none`å表示æ é¢è² - `color`å¯ä»¥ä¸º`matplotlib color`ï¼è¡¨ç¤ºè¾¹çº¿æ¡å忝è²çé¢è²ã - `linewidth`ï¼ä¸ºæµ®ç¹æ°ï¼è¡¨ç¤ºçº¿æ¡å®½åº¦ - `linestyle`ï¼æå®çº¿åï¼å¯ä»¥ä¸ºä»¥ä¸å¼ï¼ - `'-'`æè `'solid'`ï¼è¡¨ç¤ºå®çº¿ - `'--'`æè `dashed`ï¼è¡¨ç¤ºè线 - `'-.'`æè `dash_dot`ï¼è¡¨ç¤ºç¹å线 - `':'`æè `'dotted'`ï¼è¡¨ç¤ºç¹çº¿ - `'None'`æè `' '`æè `''`ï¼è¡¨ç¤ºæ²¡æçº¿æ¡ï¼ä¸ç»çº¿ï¼ - `antialiased`ï¼ä¸ä¸ªå¸å°å¼ãå¦æä¸º`True`åè¡¨ç¤ºçº¿æ¡æ¯æé¯é½¿å¤çç - `hatch`ï¼è®¾ç½®`hatching pattern`ï¼å¯ä»¥ä¸ºä¸åçå¼ï¼ - `'\'`ã`'|'`ã`'-'`ã`'+'`ã`'x'`ã`'o'`ã`'0'`ã`'.'`ã`'*'` - `fill`ï¼ä¸ºå¸å°å¼ãå¦æä¸º`True`åå¡«å å¾å½¢ï¼å¦åä¸å¡«å - `capstyle`ï¼ä¸º`'butt' or 'round' or 'projecting'`ï¼è¡¨ç¤ºçº¿æ¡å¤´ç«¯ç±»å - `joinstyle`ï¼å¯ä»¥ä¸º`'miter'ã'round'ã'bevel'`ï¼è¡¨ç¤ºç©å½¢çº¿æ¡æ¥å¤´ç±»å - å ¶ä»å ³é®ååæ°ç¨äºè®¾ç½®å±æ§ > 妿 `edgecolor, facecolor, linewidth, or antialiased` 为`None`åè¿äºå¼ä»` rc params`ä¸è¯»å 屿§å¦ä¸ï¼ - ç»§æ¿èª`Artist`åºç±»ç屿§ï¼ `.alpha`ã`.animated`ã`.axes`ã`.clip_box`ã.`.clip_on`ã`.clip_path`ã`.contains`ã`.figure`ã`.gid`ã`.label`ã`path_eects`ã`.picker`ã`.transform`ã`.url`ã`.visible`ã`.zorder` - `.antialiased`æè `.aa`屿§ï¼ä¸ä¸ªå¸å°å¼ãå¦æä¸º`True`åè¡¨ç¤ºçº¿æ¡æ¯æé¯é½¿å¤çç - `.capstyle`屿§ï¼ä¸º`'butt' or 'round' or 'projecting'`ï¼è¡¨ç¤ºçº¿æ¡å¤´ç«¯ç±»å - `.color`屿§ï¼å¯ä»¥ä¸º`matplotlib color`ï¼è¡¨ç¤ºè¾¹çº¿æ¡å忝è²çé¢è²ã - `.edgecolor`æè `.ec`屿§ï¼å¯ä»¥ä¸º`matplotlib color`ï¼è¡¨ç¤ºè¾¹çº¿æ¡çé¢è²ï¼è¥ä¸º`none`å表示æ é¢è² - `.facecolor`æè `.fc`屿§ï¼å¯ä»¥ä¸º`matplotlib color`ï¼è¡¨ç¤ºåæ¯è²ï¼è¥ä¸º`none`å表示æ é¢è² - `.fill`屿§ï¼ä¸ºå¸å°å¼ãå¦æä¸º`True`åå¡«å å¾å½¢ï¼å¦åä¸å¡«å - `.hatch`屿§ï¼è®¾ç½®`hatching pattern`ï¼å¯ä»¥ä¸ºä¸åçå¼ï¼ - `'\'`ã`'|'`ã`'-'`ã`'+'`ã`'x'`ã`'o'`ã`'0'`ã`'.'`ã`'*'` - `.joinstyle`屿§ï¼å¯ä»¥ä¸º`'miter'ã'round'ã'bevel'`ï¼è¡¨ç¤ºç©å½¢çº¿æ¡æ¥å¤´ç±»å - `.linestyle`æè `.ls`屿§ï¼æå®çº¿åï¼å¯ä»¥ä¸ºä»¥ä¸å¼ï¼ - `'-'`æè `'solid'`ï¼è¡¨ç¤ºå®çº¿ - `'--'`æè `dashed`ï¼è¡¨ç¤ºè线 - `'-.'`æè `dash_dot`ï¼è¡¨ç¤ºç¹å线 - `':'`æè `'dotted'`ï¼è¡¨ç¤ºç¹çº¿ - `'None'`æè `' '`æè `''`ï¼è¡¨ç¤ºæ²¡æçº¿æ¡ï¼ä¸ç»çº¿ï¼ - `.linewidth`æè `.lw`屿§ï¼ä¸ºæµ®ç¹æ°ï¼è¡¨ç¤ºçº¿æ¡å®½åº¦ #### f. Rectangle ç±» `matplotlib.patches.Rectangle`ç±»æ¯ç©å½¢ç±»ï¼åºç±»æ¯`matplotlib.patches.Patch`ï¼ï¼å ¶æé 彿°ä¸ºï¼`Rectangle(xy,width,height,angle=0.0,**kwargs)`ã åæ°ä¸ºï¼ - `xy`ï¼ç©å½¢å·¦ä¸è§åæ - `width`ï¼ç©å½¢å®½åº¦ - `height`ï¼ç©å½¢é«åº¦ - å ¶ä»å ³é®ååæ°ç¨äºè®¾ç½®å±æ§ å ¶å±æ§æï¼ - ç»§æ¿èª`Artist`åºç±»ç屿§ï¼ `.alpha`ã`.animated`ã`.axes`ã`.clip_box`ã.`.clip_on`ã`.clip_path`ã`.contains`ã`.figure`ã`.gid`ã`.label`ã`.picker`ã`.transform`ã`.url`ã`.visible`ã`.zorder` - ç»§æ¿èª`Patch`åºç±»ç屿§ï¼ `.antialiased`æè `.aa`ã`.capstyle`ã`.color`ã`.edgecolor`æè `.ec`ã`.facecolor`æè `.fc`ã`.fill`ã`.hatch`ã`.joinstyle`ã`.linestyle`æè `.ls`ã`.linewidth`æè `.lw`屿§ #### g. Polygonç±» `matplotlib.patches.Polygon`ç±»æ¯å¤è¾¹å½¢ç±»ãå ¶åºç±»æ¯`matplotlib.patches.Patch`ãå ¶æé 彿°ä¸ºï¼ `Polygon(xy, closed=True, **kwargs)`ãåæ°ä¸ºï¼ - `xy`æ¯ä¸ä¸ª`NÃ2`ç`numpy array`ï¼ä¸ºå¤è¾¹å½¢çé¡¶ç¹ã - `closed`为`True`åæå®å¤è¾¹å½¢å°èµ·ç¹åç»ç¹éåä»èæ¾å¼å ³éå¤è¾¹å½¢ã - å ¶ä»å ³é®ååæ°ç¨äºè®¾ç½®å±æ§ `Polygon`ç屿§æï¼ - ç»§æ¿èª`Artist`åºç±»ç屿§ï¼ `.alpha`ã`.animated`ã`.axes`ã`.clip_box`ã.`.clip_on`ã`.clip_path`ã`.contains`ã`.figure`ã`.gid`ã`.label`ã`.picker`ã`.transform`ã`.url`ã`.visible`ã`.zorder` - ç»§æ¿èª`Patch`åºç±»ç屿§ï¼ `.antialiased`æè `.aa`ã`.capstyle`ã`.color`ã`.edgecolor`æè `.ec`ã`.facecolor`æè `.fc`ã`.fill`ã`.hatch`ã`.joinstyle`ã`.linestyle`æè `.ls`ã`.linewidth`æè `.lw`屿§ #### h. PolyCollectionç±» `matplotlib.collections.PolyCollection`æ¯å¤è¾¹å½¢éåç±»ï¼å ¶åºç±»æ¯`matplotlib.collections._CollectionWithSizes`ãå®çæé 彿°ä¸ºï¼ `PolyCollection(verts, sizes=None, closed=True, **kwargs)`ã å ¶å ³é®ååæ°ä¸ºï¼ - `verts`ï¼ä¸ä¸ªé¡¶ç¹åºåãæ¯ä¸ªé¡¶ç¹é½ç±`xyå ç»`æè `xyæ°ç»`ç»æ - `sizes`ï¼ä¸ä¸ªæµ®ç¹æ°åºåï¼ä¾æ¬¡æå®æ¯ä¸ªé¡¶ç¹æ£æ¹å½¢çè¾¹é¿ã妿åºåé¿åº¦å°äºé¡¶ç¹é¿åº¦ï¼å循ç¯ä»åºå头é¨åå¼å§æé - `closed`ï¼å¦æä¸º`True`ï¼åæ¾å¼å°éå¤è¾¹å½¢ - `edgecolors`: `collection`çè¾¹çé¢è² - å ¶ä»å ³é®ååæ°ç¨äºè®¾ç½®å±æ§ ä¸é¢ä¸ºå±æ§ï¼ - ç»§æ¿èª`Artist`åºç±»ç屿§ï¼ `.alpha`ã`.animated`ã`.axes`ã`.clip_box`ã.`.clip_on`ã`.clip_path`ã`.contains`ã`.figure`ã`.gid`ã`.label`ã`.picker`ã`.transform`ã`.url`ã`.visible`ã`.zorder` - `.facecolors`: `collection`çåæ¯è² - `.linewidths`: `collection`ç边线宽 - `.antialiaseds`:æé¯é½¿å±æ§ï¼å¯ä»¥ä¸º`True`æè `False` - `.offsets`: 设置`collection`çåç§» - `.norm`: å½ä¸å对象 - `.cmap`:`color map` ## ä¸ãåºæ¬æ¦å¿µ `matplotlib`被åå为ä¸åç屿¬¡ï¼ - `matplotlib.pyplot`模åï¼ä½äº`matplotlib`çé¡¶å±ï¼å®æ¯ä¸ä¸ª`state-machine environment`ã该模åä¸çå¾å¤å½æ°æ¯ç¨äºç»å½å`Figure`çå½å`Axes`æ·»å `plot element`ï¼æ¯å¦`line`ã`text`ã`image`çãå®é常类似äº`Matlab`çç¨æ³ã - ä¸ä¸å±æ¯é¢åå¯¹è±¡çæ¥å£ï¼å¨è¿ä¸å±`pyplot`åªæ¯ç¨é¨å彿°æ¥å建`Figure`ï¼ç¶åéè¿è¯¥`Figure`æ¾å¼çå建`Axes`ï¼ç¶åéè¿é¢åå¯¹è±¡çæ¥å£å¨è¯¥`Axes`䏿·»å å¾å½¢ãæç«¯æ åµä¸ç¨æ·å¯ä»¥å®å ¨æå¼`pyplot`èå®å ¨ä½¿ç¨é¢åå¯¹è±¡çæ¥å£ã > 对äºé交äºå¼ç»å¾ï¼å®æ¹ææ¡£æ¨èç¨`pyplot`å建`Figure`ï¼ç¶å使ç¨é¢å对象æ¥å£æ¥ç»å¾ã ### 1. è¾å ¥æ°æ® `matplotlib`çææ`plotting function`æå¾ è¾å ¥`numpy.array`æè `numpy.ma.masked_array`ç±»åçæ°æ®ä½ä¸ºè¾å ¥ãæäºé¿å¾å`numpy.array`çæ°æ®æ¯å¦`numpy.matrix`ç±»åçè¾å ¥æ°æ®å¯è½ä¼å¯¼è´`matplotlib`å·¥ä½å¼å¸¸ãå¦æç¡®å®éè¦ä½¿ç¨`numpy.matrix`ï¼ä½ åºè¯¥é¦å å°å®è½¬æ¢ä¸º`numpy.array` ### 2. matplotlib ã pyplot ã pylab çå ³ç³» - `matplotlib`ï¼å®æ¯æ´ä¸ª`package` - `matplotlib.pyplot`ï¼æ¯`matplotlib`çä¸ä¸ª`module`ãå®ä¸ºåºå±çé¢å对象æ¥å£æä¾äºä¸ä¸ª`state-machine interface`ãè¿ä¸ª`state-machine`å¿ è¦çæ¶åéå¼å建`Figure`å`Axes`ï¼å¹¶ç»´æ¤`current Figure`å`current Axes` - `pylab`æ¯ä¸ä¸ªä¾¿å©ç`module`ï¼å®å¯¼å ¥äº`matplotlib.pyplot`以å`numpy`ï¼å®åªæ¯ä¸ºäº`plot`以å`math`æ¹ä¾¿èç¨ã宿¹ææ¡£ä¸æ¨è使ç¨å®ã ### 3. 代ç 飿 ¼ 宿¹ææ¡£ä¸æ¨è `MATLAB`飿 ¼ç代ç ãå 为`MATLAB`飿 ¼ä»£ç ç»´æ¤äºå ¨å±ç¶æï¼ä½ æ§è¡åä¸ä¸ª`plot`夿¬¡å¯è½ä¼åç°ç»ææ¯ä¸åçã 宿¹ææ¡£æ¨è使ç¨å¦ä¸é£æ ¼ï¼ ``` import matplotlib.pyplot as plt import numpy as np fig=plt.figure() ax=fig.add_subplot(111) ax.plot(...) ax.show() ``` è¿æ ·ç飿 ¼ä½¿å¾å¨ç»å¾äºä»¶ä¸ï¼æ¯ä¸ªè§è²é½å¾æ¸ æ¥ï¼æ°æ®çæµå¨ä¹å¾æ¸ æ¥ã ### 4. backend `matplotlib`å¯ä»¥éç¨äºé常广æ³çåºæ¯ï¼ - `matplotlib`å¯ä»¥äº¤äºå¼å°ç¨äº`python shell` - `matplotlib`å¯ä»¥åµå ¥å°`wxpython`æè `pygtk`ç`GUI`ç¨åºä¸ - `matplotlib`å¯ä»¥å¨èæ¬ä¸ä½¿ç¨ä»èçæ`postscript image` 为äºéåºäºè¿äºåºæ¯ï¼`matplotlib`é对è¿äº`target`çæä¸åçè¾åºæ ¼å¼ãè¿ç§è½åç§°ä¹ä¸º`backend`ã > ä¸ä¹ç¸å¯¹ç`frontend`æçæ¯ç¨æ·ä½¿ç¨`matplotlib`èç¼åçä»£ç æä¸¤ç§ç±»åç`backend`ï¼ - 交äºå¼ç`backend`ï¼åºç¨äº`pygtk`ã`wxpython`ã`tkinter`ã`qt4`ã`macosx`çä¸ - é交äºå¼ç`backend`ï¼ç¨äºçæ`image file`ï¼å¦`PNGãSVGãPDFãPS`çæ ¼å¼æä»¶ï¼è¿äº`backend`çååæç¤ºäºè¦åå¨çæä»¶çæ ¼å¼ï¼ æå¤ç§æ¹æ³æ¥è®¾ç½®`backend`ï¼å ¶ä¸å颿å°çæ¹æ³ä¼è¦çåé¢çæ¹æ³è®¾ç½®ç`backend` - å¨`matplotlibrc`é ç½®æä»¶ä¸è®¾ç½®ç`backend`åæ°ï¼å¦`backend: WXAgg #使use wxpython with antigrain(agg) rendering` - 设置`MPLBACKEND`ç¯å¢åéï¼æ 论æ¯å¨`shell`ä¸è®¾ç½®è¿æ¯å¨èæ¬ä¸è®¾ç½®ã - 对åä¸ªèæ¬è®¾ç½®`backend`æ¶ï¼å¯ä»¥ç´æ¥å¨`python`å½ä»¤åæ·»å `-d`å½ä»¤ï¼è¿ç§æ¹æ³ä¸æ¨èï¼`deprecated`ï¼ - å¨èæ¬ä¸ä½¿ç¨ç¹å®ç`backend`æ¶ï¼å¯ä»¥ç¨`matplotlib.use('PDF')`å½ä»¤ãè¿æ¡è¯å¥å¿ é¡»å¨`import matplotlib.pyplot`è¯å¥ä¹åæ§è¡ã妿å¨`import matplotlib.pyplot`ä¹åæ§è¡`use`è¯å¥ï¼å没æä»»ä½ææãé常建议é¿å 使ç¨`use()`æ¹æ³ï¼å 为使ç¨è¯¥èæ¬çäººæ æ³ä¿®æ¹`backend`äºã > - 设å®`backend`æ¶ï¼æ¯å¿½ç¥å¤§å°åçãå æ¤`GTKAgg`ä¹çä»·äº`gtkagg` > > - æ¥çå½åç`backend`å¯ä»¥ç¨ï¼`matplotlib.get_backend()` #### a. rendering engine `matplotlib`æä¾ç常ç¨ç`rendering engine`æ¯`Agg`ï¼å®éç¨çæ¯`Anti-Grain Geometry C++ library`ãé¤äº`macosx`ä¹å¤çææ`user interface`é½å¯ä»¥ç¨`agg rendering`ï¼å¦`WXAgg,GTKAgg,QT4Agg,TkAgg`è¿äº`backend`ã æäº`user interface`è¿æ¯æå ¶ä»å¼æï¼å¦`GTK`æ¯æ`Cario`弿ï¼å¦`GTKCariro backend`ã ä¸é¢æ¯ææç`Rendering engine`ï¼ - `AGG`ï¼è¾åº`png`æ ¼å¼æä»¶ãå®å¯ä»¥è¾åºé«è´¨éçå¾å½¢ - `PS`ï¼è¾åº`ps\eps`æ ¼å¼æä»¶ã宿¯`Postscript output` - `PDF`ï¼è¾åº`pdf`æ ¼å¼æä»¶ã - `SVG`ï¼è¾åº`svg`æ ¼å¼æä»¶ - `Cairo`ï¼å¯ä»¥è¾åº`pngãpsãpdfãsvg...`çæ ¼å¼æä»¶ - `GDK`ï¼å¯ä»¥è¾åº`pngãjpgãtiff...`çæ ¼å¼æä»¶ï¼å®ä½¿ç¨`Gimp Drawing Kit` >è¦æ³ä¿åææå®ç±»åæä»¶ï¼å¦`PDF`ï¼é£ä¹é¦å è¦è®¾ç½®åéç`backend`ï¼ ### 5. 交äºå¼æ¨¡å¼ 使ç¨äº¤äºå¼`backend`å¯ä»¥`plotting to the screen`ï¼ä½æ¯åææ¯`matplotlib`å¿ é¡»æ¯`interactive mode`ã ä½ å¯ä»¥å¨`matplotlibrc`é ç½®æä»¶ä¸è®¾ç½®`matplotlib`æ¯å¦ä½äºäº¤äºæ¨¡å¼ï¼ä¹å¯ä»¥éè¿ä»£ç `matplotlib.interacite()`æ¥è®¾ç½®`matplotlib`ä½äºäº¤äºæ¨¡å¼ãä½ å¯ä»¥éè¿ä»£ç `matplotlib.is_interactive()`æ¥å¤æä»£ç æ¯å¦äº¤äºæ¨¡å¼ãé常并ä¸å»ºè®®å¨ç»å¾è¿ç¨ä¸ä¿®æ¹äº¤äºæ¨¡å¼ï¼å æ¤è¦æåä¿®æ¹äº¤äºæ¨¡å¼åç»å¾ã > äº¤äºæ¨¡å¼ä¹å¯ä»¥éè¿`matplotlib.pyplot.ion()`å¼å¯äº¤äºæ¨¡å¼ï¼ç±`matplotlib.pyplot.ioff()`å ³éäº¤äºæ¨¡å¼ãå¦å¤äº¤äºæ¨¡å¼æ¯æ`ipython`å`python shell`ï¼ä½æ¯ä¸æ¯æ`IDLE IDE`ã  å¨äº¤äºæ¨¡å¼ä¸ï¼ - `pyplot.plot()`ç»å¾ä¹åå¾è¡¨é©¬ä¸æ¾ç¤ºï¼`pyplot`èªå¨ç»å¶å°å±å¹ï¼ä¸éè¦è°ç¨`pyplot.show()` - å¾è¡¨æ¾å¼ä¹åä½ å¯ä»¥ç»§ç»è¾å ¥å½ä»¤ãä»»ä½å¯¹å¾å½¢çä¿®æ¹ä¼å®æ¶çååºå°å¾è¡¨ä¸å»ã - 使ç¨é¢åå¯¹è±¡çæ¹æ³ï¼å¦`Axes`çæ¹æ³å¹¶ä¸ä¼èªå¨è°ç¨`draw_if_interactive()`ãå¦æä½ éè¿`Axes`æ¥ä¿®æ¹å¾è¡¨ï¼æ³æ´æ°å¾è¡¨çè¯é£ä¹ä½ éè¦æå¨è°ç¨`.draw()`æ¹æ³ãè`pyplot`模åä¸ç彿°ä¼ä¸»å¨è°ç¨`draw_if_interactive()`,å æ¤å¦æä½ æ¯éè¿`pyplot`模åä¿®æ¹å¾è¡¨é£ä¹ä¸éè¦æå¨è°ç¨`.draw()`æ¹æ³å°±æ¯å®æ¶ç»å¶ã å¨éäº¤äºæ¨¡å¼ä¸ï¼ - å¨ç»å¾ä¹åå¿ é¡»æå¨è°ç¨`pyplot.show()`æè½æ¾ç¤ºå¾è¡¨ãè¯¥å½æ°ä¼é»å¡æ§è¡ç´å°ä½ å ³éäºå¾è¡¨çªå£ã - ææçç»å¶å·¥ä½ä¼å»¶è¿å°`pyplot.show()`彿°è°ç¨ - å¨1.0çæ¬ä»¥åï¼åä¸ªèæ¬æä»¶ä¸åªè½è°ç¨ä¸æ¬¡`pyplot.show()`ï¼å¨1.01çæ¬ä¹å该éå¶è¢«æ¾æ¾ã ### 6. matplotlibçé¢è² å¯ä»¥éè¿`matplotlib.pyplot.colors()`æ¹æ³è·å`matplotlib`æ¯æçææé¢è²ãè¯¥æ¹æ³ä¸åä»»ä½äºæ ï¼å°±æ¯æä¾ä¸ä¸ªå¸®å©ææ¡£ã `matplotlib`æä¾äºä¸é¢é¢è²çå«åï¼`'b'`ï¼èè²ï¼`'g'`ï¼ç»¿è²ï¼`'r'`ï¼çº¢è²ï¼`'y'`ï¼é»è²ï¼`'c'`ï¼éè²ï¼`'k'`ï¼é»è²ï¼`'m'`ï¼æ´çº¢è²ï¼`'w'`ï¼ç½è²ã ä½ ä¹å¯ä»¥å®å¶èªå·±çé¢è²ãæä¸¤ç§æ¹æ³ï¼ - 使ç¨HTMLåå è¿å¶å符串ï¼å¦`'#eeefff'` - 使ç¨HTMLé¢è²ååï¼å¦`'red'` - 使ç¨ä¸ä¸ªå½ä¸åå°éåºé´[0-1]çRGBå ç»ï¼å¦`color=(0.3,0.3,0.4)` > å¨å建`Axes`æè `SubPlot`æ¶ï¼å¯ä»¥ç»æé 彿°æä¾ä¸ä¸ª`axisbg`åæ°æ¥æå®èæ¯è² ## åãå¸å± ### 1. ç®åå¸å± ç®åå¸å±éè¿`Figure.add_subplot(*args,**kwargs)`æ¹æ³æ¥å®æï¼å®è¿åçæ¯`Axes`å®ä¾ãå½ç¶ä½ ä¹å¯ä»¥éè¿`pyplot.subplot(*args,**kwargs)`彿°æ¥å®æï¼ä»è¿åç乿¯`Axes`å®ä¾ï¼è¯¥å½æ°åªæ¯ä¸ä¸ªä¾¿å©å½æ°ã >`SubPlot`ç±»æ¯`Axes`ç±»çåç±»ãå æ¤`SubPlot`å¯¹è±¡ä¹æ¯`Axes`对象ã #### a. å ¸åç¨æ³ æå ¸åç¨æ³æ¯`matplotlib.pyplot.subplot(nrows,ncols,plot_number)`ã`nrows`å`ncols`å°å¾è¡¨ååæ`nrows*ncols`大å°çç½æ ¼åºåï¼æ¯ä¸ä¸ªåºåé½è½åæ¾ä¸ä¸ª`SubPlot`ï¼è¯¥å½æ°å建`plot_number`ä½ç½®å¤ç`SubPlot-axes`ãå ¶ä¸`plot_number`èµ·å§äº1ï¼æå¤§å¼ä¸º`nrows*ncols`ã 妿`nrows`ã`ncols`ã`plot_number`齿¯ä¸ªä½æ°ï¼åä½ å¯ä»¥æå®ä¸ä¸ªä¸ä½æ°æ¥ç®å彿°è°ç¨`matplotlib.pyplot.subplot(integer)`ï¼å ¶ä¸ç¾åä½ä»£è¡¨`nrows`ï¼ååä½ä»£è¡¨`ncols`ï¼åä½ä»£è¡¨`plot_number`ã #### b. åæ° - `axisbg`å ³é®ååæ°ï¼æå®`subplot`çèæ¯è² - `polar`å ³é®ååæ°ï¼æå®`subplot`æ¯å¦æ¯æåæ ãé»è®¤ä¸º`False` - `projection`ï¼ - `sharex`å ³é®ååæ°ï¼æå®`subplot`ä¸å ¶ä»`Axes`(ç±è¯¥åæ°å¼æå®ï¼å ±äº«`xaxis attribute` - `sharey`å ³é®ååæ°ï¼æå®`subplot`æ¯å¦ä¸å ¶ä»`Axes`(ç±è¯¥åæ°å¼æå®ï¼å ±äº«`yaxis attribute` #### c. pyplot.subplots() 彿° ä½ å¯ä»¥éè¿`pyplot.subplots()`彿°ä¸æ¬¡æ§çå建å¤ä¸ª`SubPlot`ã >`pyplot.subplot()`æ¯æ¬¡åªä¼å建ä¸ä¸ª`SubPlot`ã  å ¶åæ°æï¼ - `nrows`ï¼è¡æ°ï¼é»è®¤ä¸º1 - `ncols`ï¼åæ°ï¼é»è®¤ä¸º1 - `sharex`ï¼ - å¦æä¸º`True`ï¼åææ`SubPlot`ç`X axis`è¢«å ±äº«ãæ¤æ¶åªææåä¸è¡ç`X`è½´å¯è§ã - å¦æä¸º`False`ï¼å`SubPlot`ç`X axis`ä¸å ±äº«ï¼æ¯ä¸ä¸ª`SbuPlot`ç`X`è½´å¯è§ã - å¦æä¸ºå符串`all`ï¼åçæäº`True` - å¦æä¸ºå符串`none`ï¼åå½å°äº`False` - å¦æä¸ºå符串`row`ï¼åæ¯ä¸è¡ç`SubPlot`å ±äº«ä¸ä¸ª`X`è½´ï¼ä¸`False`çæï¼ - å¦æä¸ºå符串`col`ï¼åæ¯ä¸åç`SubPlot`å ±äº«ä¸ä¸ª`X`è½´ï¼ä¸`True`çæï¼    - `sharey`ï¼ - å¦æä¸º`True`ï¼åææ`SubPlot`ç`Y axis`è¢«å ±äº«ãæ¤æ¶åªæç¬¬ä¸åç`Y`è½´å¯è§ã - å¦æä¸º`False`ï¼å`SubPlot`ç`Y axis`ä¸å ±äº«ï¼æ¯ä¸ä¸ª`SbuPlot`ç`Y`è½´å¯è§ã - å¦æä¸ºå符串`all`ï¼åçæäº`True` - å¦æä¸ºå符串`none`ï¼åå½å°äº`False` - å¦æä¸ºå符串`row`ï¼åæ¯ä¸è¡ç`SubPlot`å ±äº«ä¸ä¸ª`Y`è½´ï¼ä¸`True`çæï¼ - å¦æä¸ºå符串`col`ï¼åæ¯ä¸åç`SubPlot`å ±äº«ä¸ä¸ª`Y`è½´ï¼ä¸`False`çæï¼ - `squeeze`ï¼ - å¦æä¸º`True`ï¼ - 妿åªå建äºä¸ä¸ª`SubPlot`ï¼åè¿åä¸ä¸ªåéï¼å建çSubPlot对象) - 妿å建äº`N*1`æè `1*N`个`SubPlot`ï¼åè¿åä¸ä¸ª1ç»´åé - 妿å建äº`N*M`个`SubPlot`ï¼å ¶ä¸`N>1`,`M>1`ï¼ï¼åè¿åä¸ä¸ª2ç»´åé - å¦æä¸º`False`åå§ç»è¿åä¸ä¸ª2ç»´åé - `subplot_kw`ï¼ä¸ä¸ªåå ¸åæ°ï¼ç¨äºä¼ éç»`Axes.add_subplot()`æ¥å建`SubPlot` - `gridspec_kw`ï¼ä¸ä¸ªåå ¸åæ°ï¼ç¨äºä¼ éç»`GridSpec`æé 彿°æ¥å建`SubPlot`åæ¾çç½æ ¼ - `fig_kw`ï¼ä¸ä¸ªåå ¸åæ°ï¼ç¨äºä¼ éç»`pyplot.figure()`彿°ãææåè¿°æªè½è¯å«çææ¿æ¡ååæ°é½ä¼ä¼ å°è¿éã å ¶è¿åå¼ä¸º`figure,ax`ãå ¶ä¸`figure`æ¯ä¸ä¸ª`Figure`对象ï¼`ax`åå³äº`squeeze`åæ°ã ### 2. ä½¿ç¨ pyplot.subplot2grid() 彿° 使ç¨`pyplot.subplot2grid()`彿°æ¶ï¼ä½ åªéè¦æä¾ç½æ ¼å½¢ç¶ä»¥å`SubPlot`ä½ç½®å³å¯ï¼å¦ï¼ `ax=pyplot.subplot2grid((2,2),(0,0))`ï¼å®çä»·äº`ax=pyplot.subplot(2,2,1)`ãå ¶ä¸`subplot2grid()`çä½ç½®åæ ä»0å¼å§ã `subplot2grid()`æ¯æ`SubPlot`横跨æè 纵跨å¤ä¸ªåå æ ¼ã`colspan`å ³é®ååæ°æå®çºµåç跨度ï¼`rowspan`guanå°ååæ°æå®æ¨ªåç跨度ã  ### 3. ä½¿ç¨ GridSpec å SubplotSpec ä½ å¯ä»¥ç´æ¥å建`matplotlib.gridspec.GridSpec`ç¶åéè¿å®æ¥å建`SubPlot`ãå¦ï¼ ``` gs=matplotlib.gridspec.GridSpec(2,2) #ç½æ ¼2è¡2å matplotlib.pyplot.subplot(gs[0,0]) ``` çä»·äº`matplotlib.pyplot.subplot2grid((2,2),(0,0)) `GridSpec`对对象æä¾äºç±»ä¼¼`array`çç´¢å¼æ¹æ³ï¼å ¶ç´¢å¼çç»ææ¯ä¸ä¸ª`SubplotSpec`对象å®ä¾ãå¦æä½ æ³å建横跨å¤ä¸ªç½æ ¼ç`SubplotSpec`ï¼é£ä¹ä½ éè¦å¯¹`GridSpec`对象æ§è¡åçç´¢å¼ï¼å¦`pyplot.subplot(gs[0,:-1])`ã  #### a. è°æ´ GridSpec layout å¦æä½ ä½¿ç¨`GridSpec`ï¼é£ä¹ä½ å¯ä»¥è°æ´ç±`GridSpec`å建ç`SubplotSpec`ç`layout parameter`ãå¦ï¼ ``` gs=gridspec.GridSpec(3,3) gs.update(left=0.05,right=0.48,wspace=0.05) ``` è¿ç§ç¨æ³ç±»ä¼¼äº`subplots_adjust`ï¼ä½æ¯å®ä» ä» å½±åç±æ¬`GridSpec`å建ç`SubplotSpec`ãå ¶ä¸`gs.update()`çå ³é®ååæ°æï¼ - `left`å ³é®ååæ°ï¼`subplot`左侧宽度 - `right`å ³é®ååæ°ï¼`subplot`å³ä¾§å®½åº¦ - `bottom`å ³é®ååæ°ï¼`subplot`åºé¨é«åº¦ - `top`å ³é®ååæ°ï¼`subplot`é¡¶é¨é«åº¦ - `wspace`å ³é®ååæ°ï¼`subplot`ä¹é´ç空ç½å®½åº¦ - `hspace`å ³é®ååæ°ï¼`subplot`ä¹é´ç空ç½çé«åº¦ #### b. ä» SubplotSpec å建 GridSpec ï¼ ä½ å¯ä»¥ä»`SubplotSpec`å建`GridSpec`ãæ¤æ¶`layout parameter`ç±è¯¥`SubplotSpec`æå®ãå¦ï¼ ``` gs0=gridspec.GridSpec(1,2) gs00=gridspec.GridSpecFromSubplotSpec(3,3,subplot_spec=gs0[0]) ``` `matplotlib.gridspec.GridSpecFromSubplotSpec(nrows, ncols, subplot_spec, wspace=None, hspace=None,height_ratios=None,width_ratios=None)`ï¼å建ä¸ä¸ª`GridSpec`ï¼å®ç`subplot layout parameter`ç»§æ¿èªæå®ç`SubplotSpec`ãå ¶ä¸`nrows`ä¸ºç½æ ¼è¡æ°ï¼`ncols`ä¸ºç½æ ¼åæ°ï¼`subplot_spec`为æå®ç`SubplotSpec`ã  #### c. å建ä¸å大å°ç GridSpec ç½æ ¼ é»è®¤æ åµä¸ï¼`GridSpec`å建çç½æ ¼é½æ¯ç¸å大å°çãå½ç¶ä½ å¯ä»¥è°æ´ç¸å¯¹çé«åº¦åå®½åº¦ãæ³¨æè¿éåªæç¸å¯¹å¤§å°ï¼å³æ¯ä¾ï¼æ¯ææä¹çï¼ç»å¯¹å¤§å°å¼æ¯æ²¡ææä¹çãå¦ï¼ ``` gs=gridspec.GridSpec(2,2,width_ratios=[1,2],height_ratios=[4,1] plt.subplot(gs[0] .... ``` è¿é`width_ratios`å ³é®ååæ°æå®äºä¸è¡ä¸ï¼ååç宽度æ¯ä¾ï¼æå¤å°åå°±æå¤å°ä¸ªæ°åï¼ï¼ `height_ratios`å ³é®ååæ°æå®äºä¸åä¸ï¼åè¡çé«åº¦æ¯ä¾ï¼æå¤å°è¡å°±æå¤å°ä¸ªæ°åï¼ã  #### d. GridSpec.tight_layout() `GridSpec.tight_layout(fig, renderer=None, pad=1.08, h_pad=None, w_pad=None, rect=None)`:`tight_layout`è½å¤èªå¨è°æ´`subplot param`ä»è使å¾`subplot`éåº`figure area`ãå®ä» ä» æ£æ¥`ticklabelãaxis labelãtitle`çå 容æ¯å¦è¶ åºç»å¶åºåãå ¶åæ°ä¸ºï¼ - `fig`å ³é®ååæ°ï¼`Figure`对象ï¼å¾è¡¨ã - `pad`å ³é®ååæ°ï¼ä¸ä¸ªæµ®ç¹æ°ï¼å使¯`fontsize`ï¼è¡¨ç¤º`figure edge` å `edges of subplots`ä¹é´çå¡«å åºåã - `h_pad`å ³é®ååæ°ï¼ä¸ä¸ªæµ®ç¹æ°ï¼å使¯`fontsize`ï¼ç¤º`subplots`ä¹é´çé«åº¦ï¼é»è®¤ä¸º`pad`ã - `w_pad`å ³é®ååæ°ï¼ä¸ä¸ªæµ®ç¹æ°ï¼å使¯`fontsize`ï¼ç¤º`subplots`ä¹é´ç宽度ï¼é»è®¤ä¸º`pad`ã - `rect`å ³é®ååæ°ï¼å¦æç»å®äºè¯¥åæ°ä¸ºä¸ä¸ªå表æå ç»ï¼æ¯ä¸ä¸ªç©å½¢çåè¦ç´ ï¼åå«ä»£è¡¨å·¦ä¸è§åæ ï¼å®½åº¦ï¼é«åº¦ï¼ï¼åæå®äºç½æ ¼çè½®å»ç©å½¢ï¼ææç`subplots`é½ä½äºè¯¥ç©å½¢ä¸ãå ¶åæ ç³»æ¯`figure coordinate`ï¼ä»`[0...1]`ï¼å¦ææ²¡ææä¾è¯¥åæ°ï¼åé»è®¤ä¸º`(0, 0, 1, 1)`ã å½ç¶ä½ å¯ä»¥ä½¿ç¨`matplotlib.pyplot.tight_layout()`æ¥è¾¾å°åæ ·çææã  ## äºã Path `matplotlib.patch`对象åºå±ç对象就æ¯`Path`ãå®çåºæ¬ç¨æ³å¦ä¸ï¼ ``` import matplotlib.pyplot as plt from matplotlib.path import Path import matplotlib.patches as patches verts = [ (0., 0.), # left, bottom (0., 1.), # left, top (1., 1.), # right, top (1., 0.), # right, bottom (0., 0.), # ignored ] codes = [Path.MOVETO, Path.LINETO, Path.LINETO, Path.LINETO, Path.CLOSEPOLY, ] path = Path(verts, codes) fig = plt.figure() ax = fig.add_subplot(111) patch = patches.PathPatch(path) ax.add_patch(patch) ax.set_xlim(-2,2) ax.set_ylim(-2,2) plt.show() ```  ### 1. å建åä½¿ç¨ PATH `PATH`对象çå建éè¿`matplotlib.path.Path(verts,codes)`å建ï¼å ¶ä¸ï¼ - `verts`ï¼`PATH`çé¡¶ç¹ãè¿äºé¡¶ç¹å¿ é¡»ææä¸ä¸ªå°éæ²çº¿ãå ¶ä¸æ¯ä¸ªé¡¶ç¹å¿ é¡»æå®`x`åæ å`y`åæ ã - `codes`ï¼æç¤ºå¦ä½ä½¿ç¨è¿äº`PATH`é¡¶ç¹ãå®ä¸`verts`å ³ç³»æ¯ä¸ä¸å¯¹åºçãæå¦ä¸æä»¤ï¼ - `Path.STOP`ï¼ç»æ`path`çæ è®° - `Path.MOVETO`ï¼ç»ç¬æèµ·å¹¶ç§»å¨å°æå®çé¡¶ç¹ - `Path.LINETO`ï¼ç»ç¬ç»ç´çº¿ï¼ä»`current position`å°æå®çé¡¶ç¹ - `Path.CURVE3`:ç»ç¬ç»äºé¶è´å¡å°æ²çº¿ï¼ä»`current position`å°æå®ç`end point`ï¼ å ¶ä¸è¿æä¸ä¸ªåæ°æ¯æå®ç`control point` - `Path.CURVE4`ï¼ç»ç¬ç»ä¸é¶è´å¡å°æ²çº¿ï¼ä»`current position`å°æå®ç`end point`ï¼ å ¶ä¸è¿æä¸¤ä¸ªåæ°æ¯æå®ç`control points` - `Path.CLOSEPOLY`ï¼æå®ç`point`åæ°è¢«å¿½ç¥ã该æä»¤ç»ä¸æ¡çº¿æ®µï¼ ä»`current point`å°`start point` å¯ä»¥éè¿`matplotlib.patches.PathPatch(path)`æ¥æå»ºä¸ä¸ª`PathPatch`对象ï¼ç¶åéè¿`Axes.add_patch(patch)`å`Axes`æ·»å `PathPatch`对象.è¿æ ·å°±æ·»å äº`Path`å°å¾è¡¨ä¸ã  ### 2. Compound Path å¨`matplotlib`䏿æç®åç`patch primitive`ï¼å¦`Rectangle`ã`Circle`ã`Polygon`ççï¼é½æ¯ç±ç®åç`Path`æ¥å®ç°çãèå建大éç`primitive`ç彿°å¦`hist()`å`bar()`ï¼ä»ä»¬å建äºå¤§éç`Rectanle`ï¼å¯ä»¥ä½¿ç¨ä¸ä¸ª`compound path`æ¥é«æå°å®ç°ã > 使¯å®é ä¸`bar()`åå»ºçæ¯ä¸ç³»åç`Rectangle`ï¼è没æç¨å°`compound path`ï¼è¿æ¯ç±äºåå²åå ï¼æ¯åå²éçé®é¢ãï¼`bar()`彿°å äº`Coupound Path`åºç°ï¼ ä¸é¢æ¯ä¸ä¸ª`Compound Path`çä¾åï¼ ``` ... verts = np.zeros((nverts, 2)) # nverts为顶ç¹ç个æ°å 1ï¼ä¸ä¸ªç»æ¢ç¬¦ï¼ codes = np.ones(nverts, int) * Path.LINETO ## 设置 codes :codesåæ5个ä¸ç»ï¼ ## æ¯ä¸ç»ä»¥Path.MOVETOå¼å§ï¼å颿¯3个Path.LINETOï¼æåæ¯Path.CLOSEPOLY codes[0::5] = Path.MOVETO codes[4::5] = Path.CLOSEPOLY ## è®¾ç½®é¡¶ç¹ verts ## ... ## å建 Path ãPathPatchå¹¶æ·»å ## barpath = Path(verts, codes) patch = patches.PathPatch(barpath, facecolor='green',edgecolor='yellow', alpha=0.5) fig = plt.figure() ax = fig.add_subplot(111) ax.add_patch(patch) ax.show() ``` ## å ã path effect `matplotlib`ç`patheffects`模åæä¾äºä¸äºå½æ°æ¥ç»å¶`path effect`ï¼è¯¥æ¨¡åè¿å®ä¹äºå¾å¤`effect`ç±»ãå¯ä»¥åºç¨`path effect`ç`Artist`æï¼`Patch`ã`Line2D`ã`Collection`以å`Text`ãæ¯ä¸ª`Artist`ç`path effect`å¯ä»¥éè¿`.set_path_effects()`æ¹æ³æ§å¶ï¼å ¶åæ°æ¯ä¸ä¸ªå¯è¿ä»£å¯¹è±¡ï¼è¿ä»£çç»ææ¯`AbstractPathEffect`å®ä¾ï¼ä¹å¯ä»¥éè¿`Artist`æé 彿°ç`path_effects=`å ³é®ååæ°æ§å¶ã > 注æï¼`effect`ç±»çå ³é®ååæ°æ¯å¦èæ¯è²ã忝è²çä¸`Artist`ä¸åãå 为è¿äº`effect`ç±»æ¯æ´ä½å±æ¬¡çæä½ã ææç`effect`ç±»é½ç»§æ¿èª`matplotlib.patheffects.AbstractPathEffect`ç±»ã`AbstractPathEffect`çåç±»è¦è¦ç`AbstractPathEffect`ç±»ç`.draw_path(...)`æ¹æ³ã `AbstractPathEffect`ç±»çæé 彿°æä¸ª`offset`å ³é®ååæ°ï¼è¡¨ç¤º`effect`åç§»(é»è®¤ä¸º`(0,0)`) ### 1. normal effect æç®åç`effect`æ¯`normal effect`ï¼å®æ¯`matplotlib.patheffects.Normal`ç±»ãå®ç®åçç»å¶`Artist`ï¼ä¸å¸¦ä»»ä½`effect`ã å¦ï¼ ``` import matplotlib.pyplot as plt import matplotlib.patheffects as path_effects fig = plt.figure(figsize=(5, 1.5)) text = fig.text(0.5, 0.5, 'Hello path effects world!\nThis is the normal path effect.', ha='center', va='center', size=20) text.set_path_effects([path_effects.Normal()]) plt.show() ```  ### 2. drop-shadow effect æä»¬å¯ä»¥å¨åºäº`Path`ç`Artist`ä¸åºç¨`drop-shadow effect`ï¼ä¸æ²ææï¼ãå¦å¯ä»¥å¨`filled patch Artist`ä¸åºç¨`matplotlib.patheffects.SimplePatchShadow`ï¼å¨`line patch Artist`ä¸åºç¨`matplotlib.patheffects.SimpleLineShadow`ã  ä½ å¯ä»¥éè¿`path_effects=[path_effects.with*()]`æ¥æå®`path_effects`åæ°ï¼æè ç´æ¥éè¿`path_effects=[path_effects.SimpleLineShadow(),path_effects.Normal()]`æ¥æå®`path_effects`åæ°ã - åè ä¼èªå¨å°å¨`normal effect`åè·éæå®ç`effect` - åè 伿¾å¼çæå®`effect` ### 3. stand-out effect `Strok effect`å¯ä»¥ç¨äºå¶ä½åº`stand-out effect`ï¼çªåºææï¼ã  ### 4. éç¨ PathPatchEffect `PathPatchEffect`æ¯ä¸ä¸ªéç¨ç`path effect`ç±»ã妿坹æä¸ª`PathPatch`设置äº`PathPatchEffect`ï¼å该`effect`ç`.draw_path(...)`æ¹æ³æ§è¡çæ¯ç±åå§`PathPatch`计ç®çå¾å°çä¸ä¸ªæ°ç`PathPatch`ã ä¸ä¸è¬ç`effect`ç±»ä¸åï¼`PathPatchEffect`ç±»çå ³é®ååæ°æ¯ä¸`PathPatch`ä¸è´çï¼å 为é¤äº`offset`å ³é®ååæ°å¤ï¼å ¶ä»çä»»ä½å ³é®ååæ°é½ä¼ä¼ éç»`PathPatch`æé 彿°ãå¦ï¼ ``` import matplotlib.pyplot as plt import matplotlib.patheffects as path_effects fig = plt.figure(figsize=(8, 1)) t = fig.text(0.02, 0.5, 'Hatch shadow', fontsize=75, weight=1000, va='center') t.set_path_effects([path_effects.PathPatchEffect(offset=(4, -4), hatch='xxxx', facecolor='gray'), path_effects.PathPatchEffect(edgecolor='white', linewidth=1.1, facecolor='black')]) plt.show() ```  ## ä¸ãåæ åæ¢ `matplotlib`䏿åä¸ªåæ ç³»ï¼ - ç¨æ·çº§ç`data`åæ ç³»ï¼åæ 转æ¢å¯¹è±¡ä¸º`ax.transData`ã宿¯ç¨æ·çº§åæ ç³»ï¼ç±`xlim`å`ylim`æ§å¶ - `Axes`åæ ç³»ï¼åæ 转æ¢å¯¹è±¡ä¸º`ax.transAxes`ã宿¯`Axes`çåæ ç³»ï¼`(0,0)`为`Axes`çå·¦ä¸è§ï¼`(1,1)`为`Axes`çå³ä¸è§ã - `Figure`åæ ç³»ï¼åæ 转æ¢å¯¹è±¡ä¸º`fig.transFigure`ã宿¯`Figure`çåæ ç³»ï¼`(0,0)`为`Figure`çå·¦ä¸è§ï¼`(1,1)`为`Figure`çå³ä¸è§ã - `display`åæ ç³»ï¼å®æ²¡æåæ 转æ¢å¯¹è±¡ã宿¾ç¤ºçæ¯`display`çåç´ åæ ç³»ï¼`(0,0)`为`display`çå·¦ä¸è§ï¼`(width,height)`为`display`çå³ä¸è§ã åé¢ä¸ä¸ªåæ ç³»çåæ è½¬æ¢å¯¹è±¡ææ¹æ³æ§è¡åæ 转æ¢ï¼è¿äºæ¹æ³æ¥åè¾å ¥å¹¶äº§çè¾åºï¼è¾å ¥ä¸ºæ¬åæ ç³»å çåæ ç¹ï¼è¾åºä¸º`display`åæ ç³»ä¸çåæ ãï¼å æ¤`display`åæ ç³»æ²¡æåæ 转æ¢å¯¹è±¡ï¼ãå½ç¶ä»ä»¬ä¹æç¸å ³æ¹æ³å°æ¥èªäº`display`åæ ç³»ä¸çåæ è½¬æ¢åæ¬åæ ç³»å çåæ ã å¨`Artist`çæé 彿°ä¸ä¼ å ¥`transform`å ³é®ååæ°ï¼å ¶å¼ä¸ºåæ 转æ¢å¯¹è±¡ï¼ï¼å°±è½å¤åæ¢åæ ç³»ãå¦ï¼`ax.text(0.05,0.95,label,"This is a Text",transform=ax.transAxes)`ï¼å°`Text`æ¾ç½®äº`Axes`åæ ç³»ä¸ç`(0.05,0.95)`ä½ç½®å¤ã > é常ä¸å»ºè®®ç´æ¥ä½¿ç¨`display`åæ ç³»ãå 为å®åºå®äºç»å¯¹åæ ï¼å¯¼è´ä½ `resize`å¾è¡¨æ¶ä½ å¿ é¡»éæ°å®ä½åæ ãæä»¥ä½ å¿ é¡»çå¬`resize`äºä»¶ï¼é常麻ç¦ã ### 1. ç¨æ·ç data åæ ç³» å½è°ç¨`ax.set_xlimit(x_min,x_max)`以å`ax.set_ylimit(y_min,y_max)`æ¶ï¼å³å»ºç«èµ·äºç¨æ·`data`åæ ç³»ãå·¦ä¸è§åæ 为`(x_min,y_min)`ï¼å³ä¸è§åæ 为`(x_max,y_max)`ã > ææ¶åä½ å¯è½å¹¶æ²¡ææ¾å¼è°ç¨`.set_xlimit()`以å`.set_ylimit()`ãå ¶å®`matplotlib`ä¼éå¼è°ç¨å®ä»¬æ¥è®¾ç½®åæ è½´çæ°æ®èå´ã ``` import matplotlib.pyplot as plt fig = plt.figure() ax = fig.add_subplot(111) ax.set_xlim(0, 10) ax.set_ylim(-1, 1) type(ax.transData) ax.transData.transform((5, 0)) ``` ä½ å¯ä»¥è°ç¨`ax.transData`è¿å`data`åæ ç³»çåæ è½¬æ¢å¯¹è±¡ãå¯¹è¯¥åæ è½¬æ¢å¯¹è±¡è°ç¨`.transform(point)`æ¹æ³ä¼è¿å`point`å¨`display`åæ ç³»ä¸çåæ ãå ¶ä¸`point`æ¯ç¹å¨`data`åæ ç³»ä¸çåæ `(x,y)`ãä½ ä¹å¯ä»¥ç»`.transform()`æ¹æ³ä¸æ¬¡ä¼ å ¥å¤ä¸ªç¹çåæ ï¼æ¤æ¶è¾åºä¹æ¯å¯¹åºäº`display`åæ ç³»ä¸çä¸ç³»ååæ ã ä½ å¯ä»¥å¯¹`ax.trandData`è¿åçåæ è½¬æ¢å¯¹è±¡è°ç¨`.inverted()`æ¹æ³ãè¯¥æ¹æ³è¿åçæ¯ä¸ä¸ªåæ é转æ¢å¯¹è±¡ãå¯¹è¯¥åæ é转æ¢å¯¹è±¡è°ç¨`.transform(point)`æ¹æ³ä¼è¿å`point`å¨`data`åæ ç³»ä¸çåæ ãå ¶ä¸`point`æ¯ç¹å¨`display`åæ ç³»ä¸çåæ `(x,y)`ãä½ ä¹å¯ä»¥ç»`.transform()`æ¹æ³ä¸æ¬¡ä¼ å ¥å¤ä¸ªç¹çåæ ï¼æ¤æ¶è¾åºä¹æ¯å¯¹åºäº`data`åæ ç³»ä¸çä¸ç³»ååæ ã å½ä½ è°ç¨äº`ax.set_xlim()`æè `ax.set_ylim()`æ¶ï¼åæ 转æ¢å¯¹è±¡ä¼å®æ¶æ´æ°ã  ### 2. Axes åæ ç³» å¨`Axes`åæ ç³»ä¸ï¼`(0,0)`ä½äº`Axes`çå·¦ä¸è§ï¼`(1,1)`ä½äº`Axes`çå³ä¸è§ï¼`(0.5,0.5)`ä½äº`Axes`çä¸å¿ãå½ç¶ä½ å¯ä»¥å¼ç¨ä½äºè¿ä¹å¤çç¹ï¼å¦`(-0.1,1.1)`ã éå¸¸å¦æä½ éè¦å¨`Axes`䏿¾ç½®ä¸äºæå说æï¼é£ä¹ä¸è¬é½æ¯éç¨`Axes`åæ ç³»æ¥å®ä½ãè¿æ ·æ 论å¾å½¢æä¹ç¼©æ¾ï¼è¿äº`Text`é½è½ä½äºæ£ç¡®çä½ç½®ã å½ç¶ä½ ä¹å¯ä»¥å¨`Axes`ä¸éè¿`Axes`åæ ç³»æ·»å ä¸äº`Patch`ï¼ä½æ¯é常建议å¨`data`åæ ç³»ä¸æ·»å ãå ä¸ºä½ å¨`Axes`䏿·»å çå¾è¡¨å½å¾è¡¨ç¼©æ¾æ¶å¯è½ä¼åºç°é®é¢ã ### 3. æ··ååæ ç³» ææ¶åä½ éè¦æ··å`data`åæ ç³»å`Axes`åæ ç³»ãéè¿`matplotlib.transforms.blended_transform_factory( ax.transData, ax.transAxes)`è½å¤è¿åä¸ä¸ªæ··ååæ ç³»ï¼è¯¥åæ ç³»ä¸ï¼`x`åæ ä¸º`data`åæ ç³»ï¼`y`åæ ä¸º`Axes`åæ ç³»ãå æ¤è¯¥åæ ç³»ä¸`(1,1)`è¡¨ç¤ºçæ¯`data`åæ ç³»ä¸`x=1`使¯`y`ä½äºæä¸æ¹çç¹ã  æä¸¤ä¸ªå½æ°è¿åç¹å®çæ··ååæ ç³»ï¼ - `matplotlib.axes.Axes.get_xaxis_transform()`:çä»·äº `matplotlib.transforms.blended_transform_factory(ax.transData, ax.transAxes)`ã `x`åæ ä¸º`data`åæ ç³»ï¼`y`åæ ä¸º`Axes`åæ ç³»ã常ç¨äºç»å¶`x`è½´ç`label`ã`tick`ã`gridline`ã - `matplotlib.axes.Axes.get_yaxis_transform().`:çä»·äº `matplotlib.transforms.blended_transform_factory(ax.transAxes,ax.transData)`ã `x`åæ ä¸º`Axes`åæ ç³»ï¼`y`åæ ä¸º`data`åæ ç³»ã常ç¨äºç»å¶`y`è½´ç`label`ã`tick`ã`gridline`ã ### 4. å©ç¨åæ 忢å¶é é´å½±ææ `matplotlib.transform.ScaledTranslation(xt, yt, scale_trans)`å建ä¸ä¸ªæ°çåæ è½¬æ¢å¯¹è±¡ï¼è¯¥åæ 转æ¢ç±`xt`å`yt`ç»è¿`scale_trans`åæ è½¬æ¢èæ¥ã > å®åå»ºçæ¯ä¸ä¸ªå移对äºçåæ åæ¢ãåç§»çåæ æ¯ä½äº`scale_trans`ä¸çã - å¶ä½é´å½±çæ¶åï¼å°é´å½±ç`zorder`è°å°ï¼ä»è使å¾é´å½±é¦å ç»å¶å¹¶ä½äºåºå± - å½`scale_trans`为`fig.dpi_scale_trans`åæ è½¬æ¢å¯¹è±¡æ¶ï¼`xt`,`yt`çå使¯åç´ ãè¿æä¸ä¸ªæ¹æ³ä¹è½è¾¾å°åæ ·çææï¼`matplotlib.transforms.offset_copy(trans,x=xt,y=yt,units='inches')`ï¼ä½æ¯è¯¥æ¹æ³è¿åçåæ è½¬æ¢å¯¹è±¡æ¯`trans`åæäºåç§»ä¹åçææã  ### 5. ç´è§åæ ç³»ã对æ°åæ ç³»ãæåæ ç³» #### a. 设置对æ°åæ ç³» éè¿`Axes.set_xscale(value,**kwargs)`/`Axes.set_yscale(value,**kwargs)`æ¹æ³å¯ä»¥è®¾ç½®`x`è½´/`y`è½´æ¯å¦å¯¹æ°åæ ãå ¶ä¸`value`å¯ä»¥ä¸º: - `linear`ï¼çº¿æ§ - `log`ï¼å¯¹æ°ãå ¶ä¸`basex`|`basey`å ³é®åæå®å¯¹æ°çåº - `logit`ï¼ä»¥2为åºçå¯¹æ° - `symlog`ï¼å¯¹æ°ï¼å ¶ä¸`basex`|`basey`å ³é®åæå®å¯¹æ°çåº ä½ ä¹å¯ä»¥éè¿`matplotlib.pyplot.xscale()`å`matplotlib.pyplot.yscale()`æ¥è®¾ç½®å¯¹æ°åæ ãä¸å®è¦å æ·»å æ°æ®å设置对æ°åæ ã  #### b. 设置æåæ éè¿`Figure.add_axes((left,bottom,width,height), projection='polar')`æè `Figure.add_axes((left,bottom,width,height), polar=True)`æ¹æ³å¯ä»¥å建ä¸ä¸ªæåæ ç`Axes`ãå ¶ä¸`polar`å ³é®åæ¯ä¸ºäºå ¼å®¹æ§ä»£ç ï¼æ°ä»£ç æ¨èç¨`projection`å ³é®åï¼å 为`projection`å ³é®åä¸ä» å¯ä»¥è®¾ç½®æåæ ï¼è¿å¯ä»¥è®¾ç½®èªå®ä¹åæ ï¼å®å°åæ ç»ä¸ä¸ºæ å°å ³ç³»ï¼ã >`Figure.add_subplot(...)`乿¯åæ ·ç设置  ## å «ãæå·§ ### 1. å ±äº«åæ è½´ å½ä½ éè¿`pyplot.subplot()`ã`pyplot.axes()`彿°æè `Figure.add_subplot()`ã`Figure.add_axes()`æ¹æ³å建ä¸ä¸ª`Axes`æ¶ï¼ä½ å¯ä»¥éè¿`sharex`å ³é®ååæ°ä¼ å ¥å¦ä¸ä¸ª`Axes`è¡¨ç¤ºå ±äº«Xè½´ï¼æè éè¿`sharey`å ³é®ååæ°ä¼ å ¥å¦ä¸ä¸ª`Axes`è¡¨ç¤ºå ±äº«Yè½´ã å ±äº«è½´çº¿æ¶ï¼å½ä½ ç¼©æ¾æä¸ª`Axes`æ¶ï¼å¦ä¸ä¸ª`Axes`ä¹è·ç缩æ¾ã  ### 2. å建å¤ä¸ª subplot å¦æä½ æ³åå»ºç½æ ¼ä¸ç许å¤`subplot`ï¼æ§å¼é£æ ¼ç代ç é常ç¹çï¼ ``` #æ§å¼é£æ ¼ fig=plt.figure() ax1=fig.add_subplot(221) ax2=fig.add_subplot(222,sharex=ax1,sharey=ax1) ax3=fig.add_subplot(223,sharex=ax1,sharey=ax1) ax4=fig.add_subplot(224,sharex=ax1,sharey=ax1) ``` æ°å¼é£æ ¼ç代ç ç´æ¥å©ç¨`pyplot.subplots()`彿°ä¸æ¬¡æ§åå»ºï¼ ``` #æ°å¼é£æ ¼ç代ç fig,((ax1,ax2),(ax3,ax4))=plt.subplots(2,2,sharex=True,sharey=True) ax1.plot(...) ax2.plot(...) ... ``` å®å建äº`Figure`åå¯¹åºææç½æ ¼`SubPlot`ãä½ ä¹å¯ä»¥ä¸å»è§£å èç´æ¥ï¼ ``` #æ°å¼é£æ ¼ç代ç fig,axs=plt.subplots(2,2,sharex=True,sharey=True) ax1=axs[0,0] ax2=axs[0,1] ax3=axs[1,0] ax4=axs[1,1] ... ... ``` è¿åç`axs`æ¯ä¸ä¸ª`nrows*ncols`ç`array`ï¼æ¯æ`numpy`çç´¢å¼ã ### 3. è°æ´æ¥ææ¾ç¤º å½`x`轴为æ¶é´æ¥ææ¶ï¼æå¯è½é´é太å¯éå¯¼è´æ¾ç¤ºé½å å å¨ä¸èµ·ãæ¤æ¶å¯ä»¥ç¨`matplotlib.figure.Figure.autofmt_xdate()`彿°æ¥èªå¨è°æ´Xè½´æ¥æçæ¾å¼ã ä½ ä¹å¯ä»¥è°æ´Xè½´çæ¾ç¤ºæ ¼å¼ãå½X轴为æ¶é´æ¶ï¼å ¶æ¾ç¤ºç±`Axes.fmt_xdata`屿§æ¥æä¾ãè¯¥å±æ§æ¯ä¸ä¸ªå½æ°å¯¹è±¡æè 彿°ï¼æ¥åä¸ä¸ªæ¥æåæ°ï¼è¿åè¯¥æ¥æçæ¾ç¤ºå符串ã`matplotlib`å·²ç»æä¾äºè®¸å¤`date formatter`ï¼ä½ å¯ä»¥ç´æ¥ä½¿ç¨`ax.fmt_xdata=matplotlib.dates.DateFormatter('%Y-%m-%d')`  ### 4. fill_between() `Axes.fill_between(x,y1,y2=0,where=None,interpolate=False,step=None,**kwargs)`æ¹æ³å¨`y1`å`y2`ä¹é´è¿è¡å¡«å ã - `x`ï¼ä¸ä¸ªé¿åº¦ä¸ºNç`array`ï¼Xè½´æ°æ® - `y1`:ä¸ä¸ªé¿åº¦ä¸ºNç`array`ï¼Yè½´æ°æ®1 - `y2`:ä¸ä¸ªé¿åº¦ä¸ºNç`array`ï¼Yè½´æ°æ®2ï¼å¡«å å°±æ¯å¨æ²çº¿`[x,y1]`å`[x,y2]`å å´çåºåå è¿è¡ - `where`ï¼å¯éçã - å¦æä¸º`None`ï¼å表示任ä½å°æ¹é½å¡«å ã - 妿䏿¯`None`ï¼é£ä¹å°±æ¯ä¸ä¸ªé¿åº¦ä¸ºNç`boolean array`ï¼å¡«å åªä¼å¨`where`为`True`çå°æ¹è¿è¡ - `interpolate`ï¼ä¸ä¸ª`bool`å¼ãå¦æä¸º`True`ï¼åè®¡ç®æ²çº¿`[x,y1]`å`[x,y2]`ç¸äº¤ç¹å¹¶æå ¥äº¤ç¹ï¼å¦æä¸º`False`æ`None`åä¸è®¡ç®ä¸¤æ¡æ²çº¿ç交ç¹ã - `setp`ï¼å¯é é常建议æä¾ä¸ä¸ª`alpha`åæ°ï¼ç¨äºè®¾å®å¡«å çéæåº¦ã妿åä¸ä¸ªåºå被å¤ä¸ª`fill_between()`å¡«å ï¼é£ä¹è®¾å®`alpha`ä¹åä¼è®©æ¯ä¸å±é½è½æ¾ç¤ºåºæ¥ã ä¾å¦ï¼ ``` import matplotlib.pyplot as plt import numpy as np np.random.seed(1234) Nsteps = 500 t = np.arange(Nsteps) mu = 0.002 sigma = 0.01 # the steps and position S = mu + sigma*np.random.randn(Nsteps) X = S.cumsum() # the 1 sigma upper and lower analytic population bounds lower_bound = mu*t - sigma*np.sqrt(t) upper_bound = mu*t + sigma*np.sqrt(t) fig, ax = plt.subplots(1) ax.plot(t, X, lw=2, label='walker position', color='blue') ax.plot(t, mu*t, lw=1, label='population mean', color='black', ls='--') ax.fill_between(t, lower_bound, upper_bound, facecolor='yellow', alpha=0.5, label='1 sigma range') ax.legend(loc='upper left') # here we use the where argument to only fill the region where the # walker is above the population 1 sigma boundary ax.fill_between(t, upper_bound, X, where=X>upper_bound, facecolor='blue', alpha=0.5) ax.set_xlabel('num steps') ax.set_ylabel('position') ax.grid() #å¼å¯ç½æ ¼ ```  ### 5. è®¾ç½®éæ legend éå¸¸å¦æä½ è½ç¡®å®ï¼æ¯å¦å³ä¸è§ï¼æ²¡ææ°æ®ï¼é£ä¹ä½ è½å¤é常å®å ¨çå°`legend`æ¾ç½®å¨å³ä¸è§ä»èä¸ä¼é®çä½ çå¾è¡¨ï¼å¦`ax.legend(loc='upper right')`ãå¦æä½ ä¸ç¥éä½ çæ°æ®æ²çº¿çæ ·åï¼é£ä¹ä½ å¯ä»¥ä½¿ç¨`ax.legend(loc='best')`让`matplotlib`èªå¨éæ©å°`legend`æ¾ç½®å¨ä½å¤ã æ´ææçæ¹æ³æ¯è®¾ç½®`legend`为éæãæ¹æ³ä¸ºï¼`ax.legend(loc='best',fancybox=True,framealpha=0.5)`ã å ¶ä¸`fancybox`设置`legend`è¾¹æ¡ä¸ºåè§ç©å½¢ï¼`framealpha`设置`legend`çéæåº¦ã  ### 6. æ¾ç½® text box å½ä½ å¨`Axes`䏿¾ç½®`text box`æ¶ï¼ä½ æå¥½å°å®æ¾ç½®å¨`axes coordinates`ä¸ï¼è¿æ ·å½ä½ è°æ´Xè½´æè Yè½´æ¶ï¼å®è½å¤èªå¨è°æ´ä½ç½®ã ä½ ä¹å¯ä»¥ä½¿ç¨`Text`ç`.bbox`屿§æ¥è®©è¿ä¸ª`Text`å§ç»æ¾å¨æä¸ª`Patch`ä¸ãå ¶ä¸`.bbox`æ¯ä¸ªåå ¸ï¼å®åæ¾çæ¯è¯¥`Patch`å®ä¾ç屿§ã  ### 7. LATEXæå è¦æ³å¨ææ¬ä¸ä½¿ç¨`LATEX`ï¼ä½ éè¦ä½¿ç¨`'$...$'`è¿ç§å符串ï¼å³ä½¿ç¨`'$'`ä½ä¸ºçå®ç¬¦ï¼ãé常建议使ç¨`raw`å符串ï¼å³`r'$...$'`çæ ¼å¼ï¼å 为åçå符串ä¸ä¼è½¬ä¹`'\'`ï¼ä»è使å¾å¤§éç`LATEX`è¯æ³è½å¤æ£ç¡®è§£æã ### 8. å¹³ç§»åæ è½´ï¼ `Axes.spines`æ¯ä¸ªåå ¸ï¼å®åæ¾äºå个é®ï¼åå«ä¸ºï¼ `Axes.spines['left],Axes.spines['right],Axes.spines['top],Axes.spines['bottom]` ä»ä»¬é½æ¯ä¸ä¸ª`matplotlib.spines.Spine`对象ï¼è¯¥å¯¹è±¡ç»§æ¿èª`matplotlib.patches.Patch`对象ï¼ä¸»è¦æ¯è®¾ç½®å¾å½¢è¾¹ççè¾¹æ¡ã - `Spine.set_color('none')`ï¼ä¸æ¾ç¤ºè¿æ¡è¾¹çº¿ - `Spine.set_position((position)))`ï¼å°è¾¹çº¿ç§»å¨å°æå®åæ ï¼å ¶ä¸`position`æ¯ä¸ä¸ªäºå å ç»ï¼æå®äº `(position type,amount)`ï¼`position type`å¯ä»¥æ¯ï¼ - `outward`ï¼å¨ç»å¾åºåä¹å¤æ¾ç½®è¾¹çº¿ï¼ç¦»å¼ç»å¾åºåçè·ç¦»ç± `amount`æå®ï¼è´å¼åå¨ä¼å»åºåå ç»å¶ï¼ - `axes`ï¼å¨ `Axes coordinate`å æ¾ç½®è¾¹çº¿ï¼ä» 0.0 å° 1.0 ï¼ - `data`ï¼å¨ `data coordinate` å æ¾ç½®è¾¹çº¿ ä½ ä¹å¯ä»¥æå®`position`为 ï¼ `'center'`ï¼çä»·äº `('axes',0.5)`ï¼æè `'zero'`ï¼çä»·äº `('data',0.0)` ### 9. 设置轴线 tick `Axes.xaxis`è¿åä¸ä¸ª`matplotlib.axis.XAxis`对象ï¼`Axes.yaxis`è¿åä¸ä¸ª`matplotlib.axis.YAxis`对象ï¼ä»ä»¬é½æ¯ `matplotlib.axis.Axis`çå类对象ï¼ä»£è¡¨è½´çº¿ã - `Axis.set_ticks_position`ï¼è®¾ç½® `tick` ä½ç½®ï¼å¯ä»¥ä¸ºï¼` 'top' | 'bottom' | 'both' | 'default' | 'none'`ï¼å¦æä¸º `'None'`å䏿¾ç¤º `tick` - `Axis.set_label_position`ï¼è®¾ç½®`label`ä½ç½®ï¼å¯ä»¥ä¸ºï¼` 'top'| 'bottom'` ### 10ãmatplotlib.colors `matplotlib.colors`æ¯ä¸ä¸ªæ¨¡åï¼ç¨äºè½¬æ¢æ°åæè é¢è²åæ°å° `RGB` æè `RGBA` - `RGB`ï¼ä¸ä¸ªæµ®ç¹æ°åºåï¼æ3ä¸ªæµ®ç¹æ°ãæ¯ä¸ªæ°é½æ¯ 0-1ä¹é´ - `RGBA`ï¼ä¸ä¸ªæµ®ç¹æ°åºåï¼æ4ä¸ªæµ®ç¹æ°ãæ¯ä¸ªæ°é½æ¯ 0-1ä¹é´ å®éé¢æä¸ªå¸¸ç¨çåè½å°±æ¯çæä¸ä¸ª `colormap`ï¼å®ç¨äºå°ä¸ä¸ªæ°ååºåè½¬æ¢æä¸ä¸ªé¢è²åºåãé常æä¸å两个æ¥éª¤ï¼ - å°æ°åå½ä¸åå°0-1ä¹é´ï¼éè¿` Normalize` 类对象æè å ¶åç±»å¯¹è±¡ï¼ - å°0-1ä¹é´çæ°åæ å°å°ä¸ä¸ªé¢è² ï¼éè¿ `Colormap` 类对象æè å ¶åç±»å¯¹è±¡ï¼ `matplotlib.colors.ColorConverter` æä¾äºä¸ä¸ªåä¾å¯¹è±¡ç¨äºè½¬æ¢æ°åæè æ°ååºåå° `color`ã ####a. ListedColormap `matplotlib.colors.ListedColormap(colors, name=âfrom_listâ, N=None)`åºç±»æ¯`matplotlib.colors.Colormap`ãå®ç¨äºä»ä¸ä¸ª`list of colors`ä¸å建`colormap` ### 11. ç»å¶color map - `matplotlib.pyplot.pcolor(*args, **kwargs)`ï¼ç¨äºç»å¶é¢è²å¾ï¼è¿åä¸ä¸ª`matplotlib.collections.Collection `对象ã常ç¨çè°ç¨æ¹æ³ä¸ºï¼ ``` pcolor(C) pcolor(C,**kwargs) ``` - `matplotlib.pyplot.pcolormesh(*args, **kwargs)`ï¼ç¨äºç»å¶ä¸ä¸ªåè¾¹å½¢ç½æ ¼ãå®ç±»ä¼¼äº `pcolor()`ï¼ä½æ¯æºå¶ä¸åï¼ä¸è¿åçæ¯`QuadMesh`对象ãå®ç»å¾æ´å¿«ã常ç¨çè°ç¨æ¹æ³ä¸ºï¼ ``` pcolormesh(C) pcolormesh(X,Y,C) pcolormesh(C,**kwargs) ``` å ¶ä¸åæ°ä¸ºï¼ - `C`ï¼ä¸ºä¸ä¸ª `masked array`ãå®ä¼è¢«è½¬æ¢æä¸ä¸ª `ColorMap`ï¼ç¶å对ç¸åºçç½æ ¼å¾ä¸é¢è² - `X`å`Y`æ¯ç½æ ¼åæ°ï¼é常ä»ä»¬æ¯ä» `numpy.meshgrid(x_array,y_array))`è·åãå ¶ä¸ `x_array`æ¯ä¸ç»´æ°ç»ï¼ä»£è¡¨ååXè½´ç½æ ¼çæ¨ªåæ ï¼ `y_array`æ¯ä¸ç»´æ°ç»ï¼ä»£è¡¨ååYè½´ç½æ ¼ççºµåæ > X,Y,C å½¢ç¶ç¸åãå ¶ä¸XåY对åºäºç½æ ¼çååï¼C对åºäºé¢è²çåé ï¼ç¸åC[i][j]å¼çç½æ ¼ï¼é¢è²ç¸åï¼   ### 12. æ¸ é¤ç»å¾ ä½ å¯ä»¥éè¿ `pyplot`æ¥æ¸ é¤ç»å¾ï¼ - `pyplot.cla()`ï¼æ¸ é¤`current axis`ãéå½å`axis`ä¸åå½±å - `pyplot.clf()`ï¼æ¸ é¤`current figure`ã使¯å®ä¸å ³é`window` - `pyplot.close()`ï¼å ³é`window` ä½ ä¹å¯ä»¥éè¿é¢åå¯¹è±¡çæ¹æ³ï¼ - `Figure.clf()`ï¼æ¸ é¤è¯¥`Figure`å¯¹è±¡çææå 容ã ### 13. æ¸ é¤Xåæ åYåæ ï¼ ``` Axes.set_xticks(()) Axes.set_yticks(()) ```