matplotlib 成对排序箱线图和颜色

x759pob2  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(138)

我有一些成对出现的条件的数据,结构如下:

mydata = {
    "WT_before": [11,12,13],
    "WT_after": [16,17,18],
    "MRE11_before": [21,22,23,24,25],
    "MRE11_after": [26,27,28,29,30],
    "NBS1_before": [31,32,33,34],
    "NBS1_after": [36,37,38,39]
}

(my真实的数据具有更多条件,每个条件具有更多值,这只是一个示例)
我研究了如何成对地给箱线图着色,以帮助阅读图形,但在matplotlib中这样做似乎相当复杂。
目前我是这样做的:

bxplt_labels, bxplt_data = mydata.keys(), mydata.values()
bxplt_colors = ["pink", "pink", "lightgreen", "lightgreen", "lightblue", "lightblue"]

fig2, ax = plt.subplots(figsize=(20, 10), dpi=500)
bplot = plt.boxplot(bxplt_data, vert=False, showfliers=False, notch=False, patch_artist=True,)
for patch, color in zip(bplot['boxes'], bxplt_colors):
    patch.set_facecolor(color)
plt.yticks(range(1, len(bxplt_labels) + 1), bxplt_labels)
fig2.show()

其产生图:

我想:
1.对条件名称进行排序,以便我可以根据自己的选择对它们进行排序,并且
1.以更优雅的方式选择所用颜色,特别是因为我需要在以后的更多图中重复使用这些数据(如每个条件的前/后散点图)
如果需要的话,我可以重新排列数据结构,但是每个条件的值的数量不一样,所以字典对我来说是最好的选择。或者,我可以使用seborn,我看到它有很多可能性,但我不熟悉它,所以我需要更多的时间来理解它。
你能帮我弄明白吗?

y4ekin9u

y4ekin9u1#

Seaborn最容易使用"长格式"的 Dataframe 。在这种情况下,会有一些行对每个具有该条件的值重复该条件。
Seborn的箱线图接受一个关键字order=,在这里你可以改变x值的顺序。例如,order=sorted(mydata.keys())按字母顺序排序。或者list(mydata.keys())[::-1]使用原来的顺序,但是相反。默认的顺序是值在数据框中的显示方式。
对于水平箱线图,可以使用x='value', y='condition'。顺序将应用于x或y,具体取决于包含字符串的列。
对于着色,可以使用关键字palette=。它可以是一个表示matplotlib或seborn的色彩Map表的字符串,也可以是一个颜色列表。Many more options are possible.

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd

mydata = {
     "WT_before": [11, 12, 13],
     "WT_after": [16, 17, 18],
     "MRE11_before": [21, 22, 23, 24, 25],
     "MRE11_after": [26, 27, 28, 29, 30],
     "NBS1_before": [31, 32, 33, 34],
     "NBS1_after": [36, 37, 38, 39]
}
df = pd.DataFrame([[k, val] for k, vals in mydata.items() for val in vals],
                  columns=['condition', 'value'])

fig, ax = plt.subplots(figsize=(12, 5))
sns.boxplot(data=df, x='condition', y='value',
            order=['WT_before', 'WT_after', 'MRE11_before', 'MRE11_after', 'NBS1_before', 'NBS1_after'],
            palette='turbo', ax=ax)

plt.tight_layout()
plt.show()

下面是一个使用水平框的示例:

sns.boxplot(data=df, x='value', y='condition', palette='Paired')
sns.despine()
plt.xlabel('')
plt.ylabel('')
plt.tight_layout()
plt.show()

Dataframe 如下所示:
| | 调节器|价值观|
| - -| - -| - -|
| 第0页|WT_之前|十一|
| 一个|WT_之前|十二|
| 2个|WT_之前|十三|
| 三个|WT_之后|十六|
| 四个|WT_之后|十七岁|
| 五个|WT_之后|十八|
| 六个|MRE11_之前|二十一个|
| 七个|MRE11_之前|二十二个|
| 八个|MRE11_之前|二十三个|
| 九个|MRE11_之前|二十四|
| 10个|MRE11_之前|二十五个|
| 十一|MRE11_之后|二十六人|
| 十二|MRE11_之后|二十七人|
| 十三|MRE11_之后|二十八人|
| 十四|MRE11_之后|二十九人|
| 十五|MRE11_之后|三十|
| 十六|NBS1_之前|三十一个|
| 十七岁|NBS1_之前|三十二|
| 十八|NBS1_之前|三十三人|
| 十九|NBS1_之前|三十四|
| 二十个|NBS1_之后|三十六|
| 二十一个|NBS1_之后|三十七|
| 二十二个|NBS1_之后|三十八|
| 二十三个|NBS1_之后|三十九|

相关问题