此问题已在此处有答案:
Repeating x axis labels for all facets using FacetGrid in seaborn(2个答案)
上个月关门了。
所以,我目前正在尝试在python 3.9中构建一个图,使用Pandas,Seaborn和Matplotlib。虽然我不能分享数据本身,但我可以解释一下。我有6个不同的框架。在这些框架中,它们是大量的数据。我只选择前几行中需要的列。我将它们融合成一个长格式。之后,我为每个“Proportion_charge_1”到“Proportion_charge_7”创建一个面。在每个面/子图中,我为每个数据集绘制一个箱线图,显示比例的分布,也是每个“碎片化”方法。
结果如下:x1c 0d1x
当前代码:
# All dataframes
dataframes = [PT1, PT2, PT3, PT_PTM, PTQ12, PTQ3]
# Combine the DataFrames into one DataFrame
combined_df = pd.concat(dataframes, keys=['PT1', 'PT2', 'PT3', 'PT_PTM', 'PTQ12', 'PTQ3'])
# Melt the DataFrame to create a long-form DataFrame for FacetGrid
melted_df = combined_df.reset_index().melt(id_vars=['level_0', 'Fragmentation'], value_vars=columns_of_interest, var_name='Proportion_Charge', value_name='Proportion')
# Changing values
melted_df['level_0'] = melted_df['level_0'].replace(['PT1', 'PT2', 'PT3', 'PT_PTM', 'PTQ12', 'PTQ3'], ["PXD004732", "PXD010595", "PXD021013", "PXD009449", "PXD023119", "PXD023120"])
melted_df['Proportion_Charge'] = melted_df['Proportion_Charge'].replace(['Proportion_charge_1', 'Proportion_charge_2', 'Proportion_charge_3', 'Proportion_charge_4', 'Proportion_charge_5', 'Proportion_charge_6', 'Proportion_charge_7'], ['+1', '+2', '+3', '+4', '+5', '+6', '+7'])
# Create a FacetGrid for each 'Proportion Charge'
g = sns.FacetGrid(melted_df, col="Proportion_Charge", col_wrap=3, hue="Fragmentation", sharey=False)
# Iterate through each 'Proportion Charge' value
for proportion_charge, ax in zip(melted_df['Proportion_Charge'].unique(), g.axes):
# Filter the data for the current 'Proportion Charge'
data_subset = melted_df[melted_df['Proportion_Charge'] == proportion_charge]
# Create a boxplot for proportions within the FacetGrid
sns.boxplot(data=data_subset, x="level_0", y="Proportion", hue="Fragmentation", ax=ax, palette="Set3")
# Customize the plot
ax.set_title(f'Proportion Charge {proportion_charge}')
ax.set_xlabel("Dataset")
ax.set_ylabel("Proportion")
# Rotate x-axis labels for better readability
ax.set_xticklabels(ax.get_xticklabels(), rotation=45)
# Adjust the spacing between subplots
g.tight_layout()
# Show the plot
plt.show()
一般问题如下:
图的外观很好,正是我想要的。除了我想删除每个子图/面的所有图例,并将其添加到所有图的右侧或中心。我以为使用seaborn包中的色调参数会创建一个通用图例,但它似乎不适合我。另外,我想把x轴的标签加到每一个子图/面上,但我似乎不知道怎么做。
编辑:在评论Amira Bedhills之后,创建了以下图表。图例很好,我可以根据我的愿望进一步自定义它。谢谢!只有x轴标签必须添加到每个子图/面,这是预期在提到的for循环中发生的。
# I added an x-axis label to every subplot and rotate them for better readability
for ax in g.axes:
ax.set_xticklabels(ax.get_xticklabels(), rotation=45)
剧情:
1条答案
按热度按时间yizd12fk1#
如果你想从每个子图中删除图例并添加一个图例,你可以在循环中为每个
ax
使用ax.get_legend().remove()
。然后,在循环之后,使用g.axes[-1].legend()
在图外添加一个图例。然后要为每个子图添加x轴标签,你可以将线ax.set_xticklabels(ax.get_xticklabels(), rotation=45)
移动到for
循环之外。