请求协助:基于示例数据创建多重饼图(Multiple pie chart)
基于站点数据创建多重饼图的实现方案
数据预处理
首先需要将数据中的Number列转换为数值类型,可选择过滤掉数值为0的行(避免饼图中出现无意义的0占比区块)。
示例数据整理(R语言)
# 加载示例数据 df <- data.frame( Sites = c("ANKHAB1", "ANKHAB1", "ANKHAB1", "ANKHAB1", "ANKHAB1", "ANKHAB1"), Transect = c("T1", "T1", "T1", "T1", "T1", "T2"), Genus = c("Cypraea", "Diadema", "Tridacna", "Protoreaster", "Atrina", "Diadema"), Number = c("1", "2", "3", "0", "0", "3") ) # 转换Number列为数值型 df$Number <- as.numeric(df$Number) # 过滤数值为0的行(可选) df_filtered <- df[df$Number != 0, ]
示例数据整理(Python)
import pandas as pd # 加载示例数据 data = { "Sites": ["ANKHAB1", "ANKHAB1", "ANKHAB1", "ANKHAB1", "ANKHAB1", "ANKHAB1"], "Transect": ["T1", "T1", "T1", "T1", "T1", "T2"], "Genus": ["Cypraea", "Diadema", "Tridacna", "Protoreaster", "Atrina", "Diadema"], "Number": ["1", "2", "3", "0", "0", "3"] } df = pd.DataFrame(data) # 转换Number列为数值型 df["Number"] = pd.to_numeric(df["Number"]) # 过滤数值为0的行(可选) df_filtered = df[df["Number"] != 0]
R语言实现多重饼图(ggplot2)
利用ggplot2的分面功能,为每个站点+样带组合生成独立饼图:
library(ggplot2) ggplot(df_filtered, aes(x = "", y = Number, fill = Genus)) + geom_bar(stat = "identity", width = 1) + coord_polar("y", start = 0) + facet_wrap(~ interaction(Sites, Transect)) + theme_void() + labs(fill = "属名") + theme(strip.text = element_text(size = 10))
若需按站点合并样带数据,先聚合再绘图:
# 按站点和属名聚合数据 df_aggregated <- aggregate(Number ~ Sites + Genus, data = df_filtered, sum) ggplot(df_aggregated, aes(x = "", y = Number, fill = Genus)) + geom_bar(stat = "identity", width = 1) + coord_polar("y", start = 0) + facet_wrap(~ Sites) + theme_void() + labs(fill = "属名")
Python语言实现多重饼图(Matplotlib)
通过循环遍历分组,生成子图绘制饼图(适配33个站点的布局):
import matplotlib.pyplot as plt # 按站点+样带分组 groups = df_filtered.groupby(["Sites", "Transect"]) # 计算子图行列数(按6列排列) n_groups = len(groups) n_cols = 6 n_rows = (n_groups + n_cols - 1) // n_cols # 创建画布和子图 fig, axes = plt.subplots(n_rows, n_cols, figsize=(15, n_rows*3)) axes = axes.flatten() # 遍历分组绘制饼图 for idx, ((site, transect), group_data) in enumerate(groups): ax = axes[idx] ax.pie(group_data["Number"], labels=group_data["Genus"], autopct='%1.1f%%') ax.set_title(f"{site} - {transect}") # 隐藏多余子图 for ax in axes[n_groups:]: ax.axis('off') plt.tight_layout() plt.show()
按站点聚合数据的绘制方式:
# 按站点和属名聚合 df_aggregated = df_filtered.groupby(["Sites", "Genus"])["Number"].sum().reset_index() groups = df_aggregated.groupby("Sites") n_groups = len(groups) n_cols = 6 n_rows = (n_groups + n_cols - 1) // n_cols fig, axes = plt.subplots(n_rows, n_cols, figsize=(15, n_rows*3)) axes = axes.flatten() for idx, (site, group_data) in enumerate(groups): ax = axes[idx] ax.pie(group_data["Number"], labels=group_data["Genus"], autopct='%1.1f%%') ax.set_title(site) for ax in axes[n_groups:]: ax.axis('off') plt.tight_layout() plt.show()
内容的提问来源于stack exchange,提问作者José Randrianandrasana
相关产品推荐
相关产品推荐

