matplotlib 如何创建二元箱线图

uxhixvfz  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(82)

我想创建像here那样的图形,但在Python/中使用matplotlib或seaborn。我无法找到任何方法在一个图上同时获得水平和垂直胡须,也无法找到一种方法来调整盒子组件本身沿着X轴对应于不同数据的大小。

ntjbwcob

ntjbwcob1#

使用matplotlib的boxplot命令

Matplotlib的boxplot有选项来设置箱线图的位置和宽度。箱形图的矩形位于第一个和第三个分位数之间;它们的差值用作宽度,而它们的平均值用作位置。(这与数据集的中位数和平均值不同)。
下面的代码首先绘制具有调整宽度的水平箱线图。垂直箱线图绘制在顶部,但带有“框”。更改箱线图的参数允许进行更多的调整和微调。

import matplotlib.pyplot as plt
import seaborn as sns  # only used to download the iris data set

iris = sns.load_dataset('iris')
categories = iris['species'].unique()
colors = plt.cm.Set3.colors
x_column, y_column = 'sepal_length', 'sepal_width'
for cat, color in zip(categories, colors):
    # x-axis: sepal length
    x_data = iris[iris['species'] == cat][x_column]
    x_q1, x_q3 = np.percentile(x_data, [25, 75])
    # y-axis: sepal width
    y_data = iris[iris['species'] == cat][y_column]
    y_q1, y_q3 = np.percentile(y_data, [25, 75])
    plt.boxplot(x_data, positions=[(y_q3 + y_q1) / 2], widths=y_q3 - y_q1, vert=False,
                patch_artist=True, manage_ticks=False,
                boxprops={'facecolor': color, 'label': cat})
    plt.boxplot(y_data, positions=[(x_q3 + x_q1) / 2], widths=x_q3 - x_q1,
                showbox=False, manage_ticks=False,
                boxprops={'facecolor': color, 'label': cat})
plt.xlabel(x_column)
plt.ylabel(y_column)
plt.legend()  # uses the labels assigned to the boxes
plt.tight_layout()
plt.show()

字符串
x1c 0d1x的数据

通过其他轴的中线定位中心线

由于箱线图总是对称绘制,所以使用不是另一个方向q1和q3之间中点的中心线需要将中心框与箱线图本身分开绘制。q1和q3之间的距离仍然用于缩放晶须(其保持对称)。

import matplotlib.pyplot as plt
import seaborn as sns

iris = sns.load_dataset('iris')
categories = iris['species'].unique()
colors = plt.cm.Set3.colors
x_column, y_column = 'sepal_length', 'sepal_width'
for cat, color in zip(categories, colors):
    # x-axis: sepal length
    x_data = iris[iris['species'] == cat][x_column]
    x_q1, x_median, x_q3 = np.percentile(x_data, [25, 50, 75])
    # y-axis: sepal width
    y_data = iris[iris['species'] == cat][y_column]
    y_q1, y_median, y_q3 = np.percentile(y_data, [25, 50, 75])
    plt.boxplot(x_data, positions=[y_median], widths=y_q3 - y_q1, vert=False,
                showbox=False, manage_ticks=False)
    plt.boxplot(y_data, positions=[x_median], widths=x_q3 - x_q1,
                showbox=False, manage_ticks=False,
                boxprops={'facecolor': color, 'label': cat})
    plt.gca().add_patch(plt.Rectangle((x_q1, y_q1), x_q3 - x_q1, y_q3 - y_q1,
                                      facecolor=color, edgecolor='black', label=cat))
plt.xlabel(x_column)
plt.ylabel(y_column)
plt.legend()
plt.tight_layout()
plt.show()


相关问题