具有2个y轴的分组箱线图,每x刻度2个绘制变量

时间:2018-09-13 12:48:06

标签: python matplotlib seaborn boxplot

我试图制作一个18年记录的月降雨量和洪水频率的箱线图。即每个x刻度是一个月,每个x刻度与两个箱型图相关,一个是降雨,一个是洪水频率。到目前为止,我已经成功地使用seaborn绘制了这些图(请参见下面的代码和图像),但是我不知道如何创建带有两个y轴的箱形图,这是我需要的,因为每个变量的比例都不同。

数据如下所示(数据集中的Flood_freq最大值为7,此处未显示):

<div [hidden]="!(editForm.controls.quantite?.invalid)">

这是我使用的代码:

<div [hidden]="!(editForm.controls.quantite{{i}}{{f}}?.invalid)">

这将导致以下结果:

enter image description here

此后,我查看了seaborn文档,似乎不允许使用2个y轴(Seaborn boxplot with 2 y-axes)。有谁能够为我想要实现的目标提供潜在的替代方案?上面链接上的解决方案与我遇到的这个双Y轴和分组箱线图问题无关。

非常感谢您!

1 个答案:

答案 0 :(得分:1)

在获得一些虚假数据以及this tutorialthis answer的帮助下,这是一个最小的示例,说明如何仅使用numpymatplotlib来实现所需的目标:

from matplotlib import pyplot as plt
import numpy as np

rainfall = np.random.rand((12*18))*300
floods =   np.random.rand((12*18))*2

t = np.arange(0.01, 10.0, 0.01)
data1 = np.exp(t)
data2 = np.sin(2 * np.pi * t)

fig, ax1 = plt.subplots()

months = [
    'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
    'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec',
]


ax1.set_xlabel('month')
ax1.set_ylabel('rainfall', color='tab:blue')
res1 = ax1.boxplot(
    rainfall.reshape(-1,12), positions = np.arange(12)-0.25, widths=0.4,
    patch_artist=True,
)
for element in ['boxes', 'whiskers', 'fliers', 'means', 'medians', 'caps']:
    plt.setp(res1[element], color='k')

for patch in res1['boxes']:
    patch.set_facecolor('tab:blue')



ax2 = ax1.twinx()  # instantiate a second axes that shares the same x-axis
ax2.set_ylabel('floods', color='tab:orange')
res2 = ax2.boxplot(
    floods.reshape(-1,12), positions = np.arange(12)+0.25, widths=0.4,
    patch_artist=True,
)
##from https://stackoverflow.com/a/41997865/2454357
for element in ['boxes', 'whiskers', 'fliers', 'means', 'medians', 'caps']:
    plt.setp(res2[element], color='k')

for patch in res2['boxes']:
    patch.set_facecolor('tab:orange')

ax1.set_xlim([-0.55, 11.55])
ax1.set_xticks(np.arange(12))
ax1.set_xticklabels(months)

fig.tight_layout()  # otherwise the right y-label is slightly clipped
plt.show()

结果看起来像这样:

result of above code

我认为,经过一些微调,实际上看起来会很不错。