轴缩放效果

轴缩放效果示例

  1. from matplotlib.transforms import (
  2. Bbox, TransformedBbox, blended_transform_factory)
  3. from mpl_toolkits.axes_grid1.inset_locator import (
  4. BboxPatch, BboxConnector, BboxConnectorPatch)
  5. def connect_bbox(bbox1, bbox2,
  6. loc1a, loc2a, loc1b, loc2b,
  7. prop_lines, prop_patches=None):
  8. if prop_patches is None:
  9. prop_patches = {
  10. **prop_lines,
  11. "alpha": prop_lines.get("alpha", 1) * 0.2,
  12. }
  13. c1 = BboxConnector(bbox1, bbox2, loc1=loc1a, loc2=loc2a, **prop_lines)
  14. c1.set_clip_on(False)
  15. c2 = BboxConnector(bbox1, bbox2, loc1=loc1b, loc2=loc2b, **prop_lines)
  16. c2.set_clip_on(False)
  17. bbox_patch1 = BboxPatch(bbox1, **prop_patches)
  18. bbox_patch2 = BboxPatch(bbox2, **prop_patches)
  19. p = BboxConnectorPatch(bbox1, bbox2,
  20. # loc1a=3, loc2a=2, loc1b=4, loc2b=1,
  21. loc1a=loc1a, loc2a=loc2a, loc1b=loc1b, loc2b=loc2b,
  22. **prop_patches)
  23. p.set_clip_on(False)
  24. return c1, c2, bbox_patch1, bbox_patch2, p
  25. def zoom_effect01(ax1, ax2, xmin, xmax, **kwargs):
  26. """
  27. ax1 : the main axes
  28. ax1 : the zoomed axes
  29. (xmin,xmax) : the limits of the colored area in both plot axes.
  30. connect ax1 & ax2. The x-range of (xmin, xmax) in both axes will
  31. be marked. The keywords parameters will be used ti create
  32. patches.
  33. """
  34. trans1 = blended_transform_factory(ax1.transData, ax1.transAxes)
  35. trans2 = blended_transform_factory(ax2.transData, ax2.transAxes)
  36. bbox = Bbox.from_extents(xmin, 0, xmax, 1)
  37. mybbox1 = TransformedBbox(bbox, trans1)
  38. mybbox2 = TransformedBbox(bbox, trans2)
  39. prop_patches = {**kwargs, "ec": "none", "alpha": 0.2}
  40. c1, c2, bbox_patch1, bbox_patch2, p = connect_bbox(
  41. mybbox1, mybbox2,
  42. loc1a=3, loc2a=2, loc1b=4, loc2b=1,
  43. prop_lines=kwargs, prop_patches=prop_patches)
  44. ax1.add_patch(bbox_patch1)
  45. ax2.add_patch(bbox_patch2)
  46. ax2.add_patch(c1)
  47. ax2.add_patch(c2)
  48. ax2.add_patch(p)
  49. return c1, c2, bbox_patch1, bbox_patch2, p
  50. def zoom_effect02(ax1, ax2, **kwargs):
  51. """
  52. ax1 : the main axes
  53. ax1 : the zoomed axes
  54. Similar to zoom_effect01. The xmin & xmax will be taken from the
  55. ax1.viewLim.
  56. """
  57. tt = ax1.transScale + (ax1.transLimits + ax2.transAxes)
  58. trans = blended_transform_factory(ax2.transData, tt)
  59. mybbox1 = ax1.bbox
  60. mybbox2 = TransformedBbox(ax1.viewLim, trans)
  61. prop_patches = {**kwargs, "ec": "none", "alpha": 0.2}
  62. c1, c2, bbox_patch1, bbox_patch2, p = connect_bbox(
  63. mybbox1, mybbox2,
  64. loc1a=3, loc2a=2, loc1b=4, loc2b=1,
  65. prop_lines=kwargs, prop_patches=prop_patches)
  66. ax1.add_patch(bbox_patch1)
  67. ax2.add_patch(bbox_patch2)
  68. ax2.add_patch(c1)
  69. ax2.add_patch(c2)
  70. ax2.add_patch(p)
  71. return c1, c2, bbox_patch1, bbox_patch2, p
  72. import matplotlib.pyplot as plt
  73. plt.figure(1, figsize=(5, 5))
  74. ax1 = plt.subplot(221)
  75. ax2 = plt.subplot(212)
  76. ax2.set_xlim(0, 1)
  77. ax2.set_xlim(0, 5)
  78. zoom_effect01(ax1, ax2, 0.2, 0.8)
  79. ax1 = plt.subplot(222)
  80. ax1.set_xlim(2, 3)
  81. ax2.set_xlim(0, 5)
  82. zoom_effect02(ax1, ax2)
  83. plt.show()

下载这个示例