结合箱线图绘制水平线参考
Plot a horizontal line reference in combination with boxplot
我想在 boxplot
中添加一条水平线,即 'reference'。我尝试了以下代码,但它没有按预期工作。
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')
想要的结果:
xmin
和 xmax
是 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)
提供了更多 space,因此刻度标签不会被图像底部截断。旋转约20°会使情节更加紧凑。
- A
linestyle=':'
(虚线而不是虚线)可能更适合此图。
- 正如@Diziet Asahi 所说,
plt.axhline
是绘制水平线的替代方法。注意 axhline
只接受一个数字,而不是列表作为第一个参数。
由于您似乎想要绘制一条横跨整个坐标轴宽度的线,因此使用 plt.axhline()
会更简单,这就是为了这种精确使用。
那么你的代码就是:
df.boxplot(grid=False, rot=45, fontsize=15)
plt.axhline(reference, c='r')
我想在 boxplot
中添加一条水平线,即 'reference'。我尝试了以下代码,但它没有按预期工作。
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')
想要的结果:
xmin
和 xmax
是 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)
提供了更多 space,因此刻度标签不会被图像底部截断。旋转约20°会使情节更加紧凑。- A
linestyle=':'
(虚线而不是虚线)可能更适合此图。 - 正如@Diziet Asahi 所说,
plt.axhline
是绘制水平线的替代方法。注意axhline
只接受一个数字,而不是列表作为第一个参数。
由于您似乎想要绘制一条横跨整个坐标轴宽度的线,因此使用 plt.axhline()
会更简单,这就是为了这种精确使用。
那么你的代码就是:
df.boxplot(grid=False, rot=45, fontsize=15)
plt.axhline(reference, c='r')