Matplotlib:如何使用DataFrame数据创建饼图

Matplotlib:如何使用DataFrame数据创建饼图

参考:matplotlib pie chart from dataframe

Matplotlib是Python中最流行的数据可视化库之一,它提供了丰富的绘图功能,包括创建饼图。当我们需要展示数据中各部分的比例时,饼图是一个非常直观的选择。本文将详细介绍如何使用Pandas DataFrame中的数据创建饼图,并探讨各种自定义选项,以帮助你制作出既美观又信息丰富的饼图。

1. 基础知识:Matplotlib和Pandas

在开始创建饼图之前,我们需要先了解一些基础知识。Matplotlib是一个强大的绘图库,而Pandas则是用于数据处理和分析的库。结合这两个库,我们可以轻松地将数据转化为可视化图表。

首先,让我们导入必要的库:

import matplotlib.pyplot as plt
import pandas as pd

# 创建一个简单的DataFrame
data = {'Category': ['A', 'B', 'C', 'D'],
        'Value': [30, 25, 20, 25]}
df = pd.DataFrame(data)

# 创建饼图
plt.pie(df['Value'], labels=df['Category'], autopct='%1.1f%%')
plt.title('How2matplotlib.com: Simple Pie Chart')
plt.axis('equal')  # 确保饼图是圆的
plt.show()

Output:

Matplotlib:如何使用DataFrame数据创建饼图

在这个基础示例中,我们创建了一个包含类别和对应值的DataFrame,然后使用plt.pie()函数创建饼图。autopct参数用于显示百分比,axis('equal')确保饼图是圆形的。

2. 数据准备

在创建饼图之前,确保你的数据格式正确是很重要的。通常,我们需要一个包含类别和对应值的DataFrame。如果你的数据不是这种格式,可能需要进行一些预处理。

import pandas as pd

# 假设我们有一个销售数据的DataFrame
sales_data = pd.DataFrame({
    'Product': ['A', 'B', 'C', 'D', 'A', 'B', 'C'],
    'Sales': [100, 200, 150, 300, 200, 100, 250]
})

# 按产品分组并求和
grouped_data = sales_data.groupby('Product')['Sales'].sum().reset_index()

print(grouped_data)

Output:

Matplotlib:如何使用DataFrame数据创建饼图

这个例子展示了如何将原始销售数据转换为适合创建饼图的格式。

3. 创建基本饼图

有了正确格式的数据后,我们就可以创建基本的饼图了。

import matplotlib.pyplot as plt
import pandas as pd

# 使用上面准备的数据
grouped_data = pd.DataFrame({
    'Product': ['A', 'B', 'C', 'D'],
    'Sales': [300, 300, 400, 300]
})

plt.figure(figsize=(8, 8))
plt.pie(grouped_data['Sales'], labels=grouped_data['Product'], autopct='%1.1f%%')
plt.title('How2matplotlib.com: Sales Distribution by Product')
plt.axis('equal')
plt.show()

Output:

Matplotlib:如何使用DataFrame数据创建饼图

这个示例创建了一个简单的饼图,显示了各产品的销售比例。figsize参数用于设置图表大小,autopct用于在每个扇区显示百分比。

4. 自定义颜色

默认的颜色可能不总是符合你的需求。Matplotlib允许我们自定义饼图的颜色。

import matplotlib.pyplot as plt
import pandas as pd

data = pd.DataFrame({
    'Category': ['A', 'B', 'C', 'D'],
    'Value': [30, 25, 20, 25]
})

colors = ['#ff9999', '#66b3ff', '#99ff99', '#ffcc99']

plt.figure(figsize=(8, 8))
plt.pie(data['Value'], labels=data['Category'], colors=colors, autopct='%1.1f%%')
plt.title('How2matplotlib.com: Custom Color Pie Chart')
plt.axis('equal')
plt.show()

Output:

Matplotlib:如何使用DataFrame数据创建饼图

在这个例子中,我们定义了一个自定义的颜色列表,并通过colors参数应用到饼图中。

5. 突出显示特定扇区

有时,我们可能想要突出显示某个特定的扇区。这可以通过设置explode参数来实现。

import matplotlib.pyplot as plt
import pandas as pd

data = pd.DataFrame({
    'Category': ['A', 'B', 'C', 'D'],
    'Value': [30, 25, 20, 25]
})

explode = (0.1, 0, 0, 0)  # 突出显示第一个扇区

plt.figure(figsize=(8, 8))
plt.pie(data['Value'], labels=data['Category'], explode=explode, autopct='%1.1f%%', shadow=True)
plt.title('How2matplotlib.com: Pie Chart with Exploded Slice')
plt.axis('equal')
plt.show()

Output:

Matplotlib:如何使用DataFrame数据创建饼图

explode参数是一个元组,每个值对应一个扇区。正值会将扇区从中心”拉出”。shadow=True添加了阴影效果,使图表更加立体。

6. 添加图例

当标签太长或者数据点太多时,直接在饼图上显示标签可能会很拥挤。这时,我们可以使用图例来替代。

import matplotlib.pyplot as plt
import pandas as pd

data = pd.DataFrame({
    'Category': ['Category A', 'Category B', 'Category C', 'Category D', 'Category E'],
    'Value': [30, 25, 20, 15, 10]
})

plt.figure(figsize=(10, 8))
patches, texts, autotexts = plt.pie(data['Value'], autopct='%1.1f%%', startangle=90)
plt.legend(patches, data['Category'], title="Categories", loc="center left", bbox_to_anchor=(1, 0, 0.5, 1))
plt.title('How2matplotlib.com: Pie Chart with Legend')
plt.axis('equal')
plt.tight_layout()
plt.show()

Output:

Matplotlib:如何使用DataFrame数据创建饼图

在这个例子中,我们使用plt.legend()函数添加了图例。bbox_to_anchor参数用于调整图例的位置,使其位于饼图的右侧。

7. 嵌套饼图

嵌套饼图(也称为环形图)可以用来展示多层次的数据。

import matplotlib.pyplot as plt
import pandas as pd

# 外圈数据
outer_data = pd.DataFrame({
    'Category': ['A', 'B', 'C'],
    'Value': [40, 30, 30]
})

# 内圈数据
inner_data = pd.DataFrame({
    'Category': ['X', 'Y', 'Z'],
    'Value': [20, 30, 50]
})

fig, ax = plt.subplots(figsize=(10, 8))

# 绘制外圈
ax.pie(outer_data['Value'], labels=outer_data['Category'], radius=1, wedgeprops=dict(width=0.3, edgecolor='white'))

# 绘制内圈
ax.pie(inner_data['Value'], labels=inner_data['Category'], radius=0.7, wedgeprops=dict(width=0.3, edgecolor='white'))

plt.title('How2matplotlib.com: Nested Pie Chart')
plt.axis('equal')
plt.show()

Output:

Matplotlib:如何使用DataFrame数据创建饼图

这个示例创建了一个嵌套饼图,外圈和内圈分别代表不同的数据集。radius参数用于控制饼图的大小,wedgeprops用于设置扇区的宽度和边缘颜色。

8. 半圆饼图

有时,使用半圆形的饼图可以为布局提供更多空间或创造独特的视觉效果。

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

data = pd.DataFrame({
    'Category': ['A', 'B', 'C', 'D', 'E'],
    'Value': [30, 25, 20, 15, 10]
})

plt.figure(figsize=(10, 6))
plt.pie(data['Value'], labels=data['Category'], autopct='%1.1f%%', startangle=90, counterclock=False)
plt.title('How2matplotlib.com: Half Pie Chart')
plt.axis('equal')
plt.xlim(-1.1, 1.1)
plt.ylim(0, 1.1)
plt.show()

Output:

Matplotlib:如何使用DataFrame数据创建饼图

在这个例子中,我们通过设置startangle=90counterclock=False来创建一个半圆形的饼图。xlimylim用于调整图表的显示范围。

9. 添加中心文本

在饼图的中心添加文本可以用来显示总数或其他重要信息。

import matplotlib.pyplot as plt
import pandas as pd

data = pd.DataFrame({
    'Category': ['A', 'B', 'C', 'D'],
    'Value': [30, 25, 20, 25]
})

total = data['Value'].sum()

plt.figure(figsize=(8, 8))
plt.pie(data['Value'], labels=data['Category'], autopct='%1.1f%%')
plt.title('How2matplotlib.com: Pie Chart with Center Text')
plt.text(0, 0, f'Total\n{total}', ha='center', va='center', fontsize=20)
plt.axis('equal')
plt.show()

Output:

Matplotlib:如何使用DataFrame数据创建饼图

这个示例在饼图中心添加了显示总数的文本。hava参数用于控制文本的水平和垂直对齐方式。

10. 动态生成颜色

当数据类别较多时,手动指定颜色可能会很麻烦。我们可以使用颜色映射来动态生成颜色。

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# 生成一些随机数据
np.random.seed(42)
data = pd.DataFrame({
    'Category': [f'Cat {i}' for i in range(10)],
    'Value': np.random.randint(10, 100, 10)
})

# 使用颜色映射生成颜色
colors = plt.cm.Spectral(np.linspace(0, 1, len(data)))

plt.figure(figsize=(10, 8))
plt.pie(data['Value'], labels=data['Category'], colors=colors, autopct='%1.1f%%')
plt.title('How2matplotlib.com: Pie Chart with Dynamic Colors')
plt.axis('equal')
plt.show()

Output:

Matplotlib:如何使用DataFrame数据创建饼图

在这个例子中,我们使用plt.cm.Spectral颜色映射和np.linspace函数来为每个类别生成唯一的颜色。

11. 处理小数值

当饼图中有很小的数值时,标签可能会重叠或难以阅读。我们可以将小于某个阈值的类别合并为”其他”类别。

import matplotlib.pyplot as plt
import pandas as pd

data = pd.DataFrame({
    'Category': ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'],
    'Value': [30, 25, 20, 15, 5, 3, 1, 1]
})

# 定义阈值
threshold = 5

# 将小于阈值的类别合并为"其他"
other = data[data['Value'] < threshold]
main = data[data['Value'] >= threshold]

other_sum = other['Value'].sum()
main = main.append({'Category': 'Other', 'Value': other_sum}, ignore_index=True)

plt.figure(figsize=(10, 8))
plt.pie(main['Value'], labels=main['Category'], autopct='%1.1f%%')
plt.title('How2matplotlib.com: Pie Chart with Grouped Small Values')
plt.axis('equal')
plt.show()

这个示例将所有小于5%的类别合并为一个”其他”类别,使饼图更加清晰易读。

12. 添加数据标签

除了百分比,我们可能还想在饼图上显示实际的数值。

import matplotlib.pyplot as plt
import pandas as pd

data = pd.DataFrame({
    'Category': ['A', 'B', 'C', 'D'],
    'Value': [300, 250, 200, 250]
})

def make_autopct(values):
    def my_autopct(pct):
        total = sum(values)
        val = int(round(pct*total/100.0))
        return f'{pct:.1f}%\n({val:d})'
    return my_autopct

plt.figure(figsize=(10, 8))
plt.pie(data['Value'], labels=data['Category'], autopct=make_autopct(data['Value']))
plt.title('How2matplotlib.com: Pie Chart with Value Labels')
plt.axis('equal')
plt.show()

Output:

Matplotlib:如何使用DataFrame数据创建饼图

这个例子定义了一个自定义函数来同时显示百分比和实际数值。

13. 创建3D饼图

虽然2D饼图通常就足够了,但有时3D效果可以增加视觉吸引力。

import matplotlib.pyplot as plt
import pandas as pd

data = pd.DataFrame({
    'Category': ['A', 'B', 'C', 'D'],
    'Value': [30, 25, 20, 25]
})

fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')

colors = ['#ff9999', '#66b3ff', '#99ff99', '#ffcc99']

wedges, texts = ax.pie(data['Value'], labels=data['Category'], colors=colors, 
                       startangle=90, labeldistance=1.1, 
                       wedgeprops=dict(width=0.5, edgecolor='white'))

ax.set_title('How2matplotlib.com: 3D Pie Chart')
plt.show()

这个示例使用projection='3d'创建了一个3D饼图。wedgeprops参数用于设置饼图的宽度和边缘颜色,创造出3D效果。

14. 饼图与条形图结合

有时,将饼图与条形图结合可以提供更全面的数据视图。

import matplotlib.pyplot as plt
import pandas as pd

data = pd.DataFrame({
    'Category': ['A', 'B', 'C', 'D'],
    'Value': [30, 25, 20, 25]
})

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 7))

# 饼图
ax1.pie(data['Value'], labels=data['Category'], autopct='%1.1f%%', startangle=90)
ax1.set_title('How2matplotlib.com: Pie Chart')

# 条形图
ax2.bar(data['Category'], data['Value'])
ax2.set_title('How2matplotlib.com: Bar Chart')
ax2.set_ylabel('Value')

plt.tight_layout()
plt.show()

Output:

Matplotlib:如何使用DataFrame数据创建饼图

这个例子在同一个图表中创建了一个饼图和一个条形图,提供了数据的两种不同视角。

15. 动画饼图

创建动画饼图可以展示数据随时间的变化。

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from matplotlib.animation import FuncAnimation

# 创建初始数据
data = pd.DataFrame({
    'Category': ['A', 'B', 'C', 'D'],
    'Value': [25, 25, 25, 25]
})

fig, ax = plt.subplots(figsize=(8, 8))

def update(frame):
    ax.clear()
    # 更新数据
    data['Value'] = np.random.randint(10, 40, size=4)
    ax.pie(data['Value'], labels=data['Category'], autopct='%1.1f%%')
    ax.set_title(f'How2matplotlib.com: Animated Pie Chart (Frame {frame})')
    ax.axis('equal')

ani = FuncAnimation(fig, update, frames=range(50), repeat=False)
plt.show()

Output:

Matplotlib:如何使用DataFrame数据创建饼图

这个示例创建了一个动画饼图,每一帧都会随机更新数据。注意,这个动画在某些环境中可能无法直接显示,可能需要保存为视频文件。

16. 处理缺失值

在实际数据中,我们可能会遇到缺失值。处理这些缺失值对于创建准确的饼图很重要。

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# 创建包含缺失值的数据
data = pd.DataFrame({
    'Category': ['A', 'B', 'C', 'D', 'E'],
    'Value': [30, 25, np.nan, 20, 25]
})

# 删除缺失值
data_clean = data.dropna()

plt.figure(figsize=(8, 8))
plt.pie(data_clean['Value'], labels=data_clean['Category'], autopct='%1.1f%%')
plt.title('How2matplotlib.com: Pie Chart with Handled Missing Values')
plt.axis('equal')
plt.show()

Output:

Matplotlib:如何使用DataFrame数据创建饼图

在这个例子中,我们使用dropna()方法删除了包含缺失值的行,然后创建饼图。

17. 使用Seaborn创建饼图

虽然Matplotlib很强大,但有时使用更高级的库如Seaborn可以简化饼图的创建过程。

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

data = pd.DataFrame({
    'Category': ['A', 'B', 'C', 'D'],
    'Value': [30, 25, 20, 25]
})

plt.figure(figsize=(8, 8))
sns.set_style("whitegrid")
sns.set_palette("pastel")

plt.pie(data['Value'], labels=data['Category'], autopct='%1.1f%%')
plt.title('How2matplotlib.com: Pie Chart using Seaborn')
plt.axis('equal')
plt.show()

Output:

Matplotlib:如何使用DataFrame数据创建饼图

Seaborn主要用于设置样式和调色板,使得饼图看起来更加美观。

18. 创建环形图

环形图是饼图的一种变体,中心有一个空洞,可以用来显示额外信息。

import matplotlib.pyplot as plt
import pandas as pd

data = pd.DataFrame({
    'Category': ['A', 'B', 'C', 'D'],
    'Value': [30, 25, 20, 25]
})

fig, ax = plt.subplots(figsize=(8, 8))

center_circle = plt.Circle((0,0), 0.70, fc='white')

def make_autopct(values):
    def my_autopct(pct):
        total = sum(values)
        val = int(round(pct*total/100.0))
        return f'{pct:.1f}%\n({val:d})'
    return my_autopct

wedges, texts, autotexts = ax.pie(data['Value'], labels=data['Category'], 
                                  autopct=make_autopct(data['Value']),
                                  wedgeprops=dict(width=0.5))

ax.add_artist(center_circle)
plt.title('How2matplotlib.com: Donut Chart')
plt.axis('equal')
plt.show()

Output:

Matplotlib:如何使用DataFrame数据创建饼图

这个例子创建了一个环形图,并在每个扇区显示了百分比和实际数值。

19. 饼图中的子图

有时,我们可能需要在一个图表中展示多个相关的饼图。

import matplotlib.pyplot as plt
import pandas as pd

data1 = pd.DataFrame({
    'Category': ['A', 'B', 'C'],
    'Value': [40, 30, 30]
})

data2 = pd.DataFrame({
    'Category': ['X', 'Y', 'Z'],
    'Value': [35, 40, 25]
})

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 7))

ax1.pie(data1['Value'], labels=data1['Category'], autopct='%1.1f%%')
ax1.set_title('How2matplotlib.com: Pie Chart 1')

ax2.pie(data2['Value'], labels=data2['Category'], autopct='%1.1f%%')
ax2.set_title('How2matplotlib.com: Pie Chart 2')

plt.tight_layout()
plt.show()

Output:

Matplotlib:如何使用DataFrame数据创建饼图

这个示例在一个图表中创建了两个并排的饼图,可以用于比较不同数据集。

20. 极坐标条形图

虽然不是严格意义上的饼图,但极坐标条形图可以作为饼图的一个有趣替代品。

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

data = pd.DataFrame({
    'Category': ['A', 'B', 'C', 'D', 'E'],
    'Value': [30, 25, 20, 15, 10]
})

fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot(111, projection='polar')

theta = np.linspace(0.0, 2 * np.pi, len(data), endpoint=False)
radii = data['Value']
width = 2 * np.pi / len(data)

bars = ax.bar(theta, radii, width=width, bottom=0.0)

for r, bar in zip(radii, bars):
    bar.set_facecolor(plt.cm.viridis(r / 10.))
    bar.set_alpha(0.8)

ax.set_xticks(theta)
ax.set_xticklabels(data['Category'])
ax.set_title('How2matplotlib.com: Polar Bar Chart')

plt.show()

Output:

Matplotlib:如何使用DataFrame数据创建饼图

这个例子创建了一个极坐标条形图,每个条形的长度代表数值的大小,颜色根据数值动态生成。

结论

通过本文,我们详细探讨了如何使用Matplotlib和Pandas DataFrame创建各种类型的饼图。从基本的饼图到高级的自定义选项,我们涵盖了广泛的技术和方法。这些技巧不仅可以帮助你创建美观的饼图,还能确保你的数据以最有效和最具信息量的方式呈现。

记住,虽然饼图是展示比例数据的有效工具,但它并不适合所有类型的数据。在选择使用饼图时,要考虑你的数据类型和你想传达的信息。对于某些数据集,条形图或其他类型的图表可能更合适。

最后,不断实践和实验是掌握数据可视化的关键。尝试不同的颜色方案、布局和设计选项,找出最能有效传达你的数据故事的方式。随着经验的积累,你将能够创建既美观又富有洞察力的数据可视化作品。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程