在 matplotlib 中绘制子图的分割线

Mat*_*man 5 python numpy graph matplotlib pandas

我被要求生成一些用于多基线研究设计的图表,这是一种特殊类型的图表。我把它当作一个学习更多 Matplotlib 和 Pandas 的机会,但我遇到的一件事是 BASE 和 INTERVENTION 之间的分界线。我需要它继续完成多个子图并且还可以很好地扩展。有什么办法可以完成这样的事情吗?我尝试过使用 Lines.Line2D 和 ConnectionPatch 进行实验,但我坚持正确缩放和确定位置。

\n

到目前为止我的(简单)代码。

\n
import matplotlib.pyplot as plt\nimport numpy as np\nimport pandas as pd\n\ny = np.array([0,1,2,3,4])\nfig, axs = plt.subplots(3, sharex=True, sharey=True)\nfig.suptitle("I1 - Reakce na zm\xc4\x9bnu prvku")\naxs[0].plot(df.index,df[\'A\'], color=\'lightblue\', label="A")\naxs[1].plot(df.index,df[\'N\'], color=\'darkblue\', label="N")\naxs[2].plot(df.index,df[\'P\'], color=\'blue\', label="P")\n\nplt.yticks(np.arange(y.min(), y.max(), 1))\nplt.show()\n
Run Code Online (Sandbox Code Playgroud)\n

到目前为止我的情节(上面代码的结果):\n我当前的图表

\n

上下文的示例图:

\n

多基线设计图示例

\n

Der*_*k O 4

借用巴勃罗的有用答案,似乎使用fig.transFigure可以访问每个子图中的坐标,并且您可以在所有这些坐标之间绘制线条。这可能是最好的方法,因为它使起点和终点易于确定。由于 x 坐标方便地从 1 到 12,因此您还可以将每个子图分成两部分,以便在点之间留出间隙,以便注释线通过。

\n
import numpy as np\nimport pandas as pd\n\nimport matplotlib\nimport matplotlib.pyplot as plt\nfrom matplotlib.patches import ConnectionPatch\n\ny = np.array([0,1,2,3,4])\n\n## recreate your data\ndf = pd.DataFrame({\n    \'A\':[0, 1, 1, 1, 2, 2, 3, 2, 3] + [float("nan")]*3,\n    \'N\':[1, 0, 0, 2, 1, 1, 2, 3, 3, 3, 3, 3],\n    \'P\':[0, 1, 1, 1, 2, 1, 1, 1, 2, 3, 3, 3],\n    },  \n    index=range(1,13)\n)\n\n\nfig, axs = plt.subplots(3, sharex=True, sharey=True)\nfig.suptitle("I1 - Reakce na zm\xc4\x9bnu prvku")\n\n## create a gap in the line\naxs[0].plot(df.index[0:3],df[\'A\'][0:3], color=\'lightblue\', label="A", marker=\'.\')\naxs[0].plot(df.index[3:12],df[\'A\'][3:12], color=\'lightblue\', label="A", marker=\'.\')\n\n## create a gap in the line\naxs[1].plot(df.index[0:8],df[\'N\'][0:8], color=\'darkblue\', label="N", marker=\'.\')\naxs[1].plot(df.index[8:12],df[\'N\'][8:12], color=\'darkblue\', label="N", marker=\'.\')\n\n## create a gap in the line\naxs[2].plot(df.index[0:10],df[\'P\'][0:10], color=\'blue\', label="P", marker=\'.\')\naxs[2].plot(df.index[10:12],df[\'P\'][10:12], color=\'blue\', label="P", marker=\'.\')\n\nplt.yticks(np.arange(y.min(), y.max(), 1))\n\n\ntransFigure = fig.transFigure.inverted()\n\n## Since your subplots have a ymax value of 3, setting the end y-coordinate\n## of each line to just above that value should help it display outside of the figure\n\ncoord1 = transFigure.transform(axs[0].transData.transform([3.5,3]))\ncoord2 = transFigure.transform(axs[1].transData.transform([3.5,3.5]))\ncoord3 = transFigure.transform(axs[1].transData.transform([8.5,3.5]))\ncoord4 = transFigure.transform(axs[2].transData.transform([8.5,3.5]))\ncoord5 = transFigure.transform(axs[2].transData.transform([10.5,3.5]))\ncoord6 = transFigure.transform(axs[2].transData.transform([10.5,0]))\n\n## add a vertical dashed line\nline1 = matplotlib.lines.Line2D((coord1[0],coord2[0]),(coord1[1],coord2[1]),\n                               transform=fig.transFigure,\n                               ls=\'--\',\n                               color=\'grey\')\n\n## add a horizontal dashed line\nline2 = matplotlib.lines.Line2D((coord2[0],coord3[0]),(coord2[1],coord3[1]),\n                               transform=fig.transFigure,\n                               ls=\'--\',\n                               color=\'grey\')\n\n## add a vertical dashed line\nline3 = matplotlib.lines.Line2D((coord3[0],coord4[0]),(coord3[1],coord4[1]),\n                               transform=fig.transFigure,\n                               ls=\'--\',\n                               color=\'grey\')\n\n## add a horizontal dashed line\nline4 = matplotlib.lines.Line2D((coord4[0],coord5[0]),(coord4[1],coord5[1]),\n                               transform=fig.transFigure,\n                               ls=\'--\',\n                               color=\'grey\')\n\n## add a vertical dashed line\nline5 = matplotlib.lines.Line2D((coord5[0],coord6[0]),(coord5[1],coord6[1]),\n                               transform=fig.transFigure,\n                               ls=\'--\',\n                               color=\'grey\')\n\nfig.lines.extend([line1, line2, line3, line4, line5])\nplt.show()\n
Run Code Online (Sandbox Code Playgroud)\n

在此输入图像描述

\n