在箱线图中绘制水平参考线

3
我希望添加一条横线,即“参考线”在 boxplot 中。我尝试了下面的代码,但效果并不如预期。
df=pd.DataFrame({"Prior": initial_FOPR,
                "DSI": pca_FOPR,
                "DSI.ESMDA": ksvd_FOPR,
                "DSI.ESMDA.LOC": dct_FOPR,"ES-MDA": Basic_FOPR,})
df.boxplot(grid=False, rot=45, fontsize=15)
plt.hlines(reference,xmin=min(reference),xmax=max(reference),'r')

期望的结果: 期望的结果

“reference”是一个数组吗?我认为这一行应该写成类似于plt.hlines(reference, xmin=min(你的x轴), xmax=max(你的x轴))的形式。 - Francisca Concha-Ramírez
2个回答

6

如果您想要绘制跨越整个轴宽度的线条,使用plt.axhline()会更简单,因为它是专门用于这种情况的。

那么您的代码将如下所示:

df.boxplot(grid=False, rot=45, fontsize=15)
plt.axhline(reference, c='r')

4

xminxmax是指您x轴的最左侧和最右侧。由于您的x轴只是一个标签列表,matplotlib在内部使用数字0、1、2等。plt.xlim()是获取这些限制的简单方法。要绘制虚线,请使用“--”作为线型。

hlines的第一个参数(在本示例中称为reference)是绘制水平线的y位置。如果reference是数组,则可以一次绘制多条水平线。

plt.gcf().autofmt_xdate()可以帮助自动选择x标签的旋转角度以更好地适应图像。

以下是示例:

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

N = 50
df = pd.DataFrame({"Prior": np.random.geometric(0.5, N) * 2 + 10,
                   "DSI": np.random.geometric(0.1, N) * 3 + 20,
                   "DSI.ESMDA": np.random.geometric(0.2, N) + 40,
                   "DSI.ESMDA.LOC": np.random.geometric(0.2, N) * 4 + 30,
                   "ES-MDA": np.random.geometric(0.7, N) * 2.5 + 60})
df.boxplot(grid=False, rot=18, fontsize=15)
reference = [20, 50, 75]
left, right = plt.xlim()
plt.hlines(reference, xmin=left, xmax=right, color='r', linestyles='--')
plt.subplots_adjust(bottom=0.20)
plt.show()

示例图

附加说明:

  • plt.subplots_adjust(bottom=0.20) 提供更多的空间,以使刻度标签不会被图片底部截断。旋转约20°可以使图形更加紧凑。
  • 对于这个图形来说,linestyle=':'(点线而非破折号)可能更好看。
  • 正如@Diziet Asahi所指出的那样,plt.axhline是绘制水平线的另一种选择。请注意,axhline仅接受一个数字,而不是列表,作为第一个参数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接