结合水平线图绘制水平线参考

时间:2019-11-28 12:05:13

标签: pandas matplotlib boxplot

我想添加一条水平线,即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')

所需结果: expected result

2 个答案:

答案 0 :(得分:2)

由于您似乎想在整个轴的宽度上画一条线,因此使用plt.axhline()会更简单,这正是这种精确使用的目的。

那么您的代码就是:

<validation samples>

答案 1 :(得分:1)

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()

example plot

其他说明:

  • plt.subplots_adjust(bottom=0.20)提供了更多的空间,因此刻度标签不会被图像底部切除。旋转约20°可使绘图更加紧凑。
  • 此图最好用linestyle=':'(点线代替虚线)。
  • 如@Diziet Asahi所述,plt.axhline是绘制水平线的替代方法。请注意,axhline仅接受一个数字,而不接受列表作为第一个参数。