You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求协助:基于示例数据创建多重饼图(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 08:44:51