Python可视化-多子图

本文展示了如何使用Python中的matplotlib和seaborn库创建四个子图,包括景区评分分布的旭日图、旅游数据的渐变堆叠面积图、增长率排序折线图以及评分与各景点比例的关系图,以展示数据的分布和变化趋势。
摘要由CSDN通过智能技术生成

本次我们使用数据画一个多子图:

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

# 设置中文字体和负号
plt.rcParams['font.sans-serif'] = ['KaiTi']
plt.rcParams['axes.unicode_minus'] = False

# 数据
data1 = {
    '景区名称': ['荔波小七孔', '黄果树瀑布', '镇远古城', '梵净山', '安顺龙宫', '乌蒙大草原', '百里杜鹃', '千户苗寨'],
    '评分': [4.7, 4.5, 4.5, 4.4, 4.4, 4.4, 4.3, 4.2]
}

data2 = {
    '年份': [2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023],
    '旅游人数': [4747.89, 6262.89, 8190.23, 10439.95, 12913.02, 17019.36, 21401.18, 26761.28, 32134.94, 37630.01, 53148.42, 74417.43, 96858.12, 113526.6, 61781.49, 64436.68, 49206.88, 63558.44],
    '旅游收入': [387.05, 512.28, 653.13, 805.23, 1061.23, 1429.48, 1860.16, 2370.65, 2895.98, 3512.82, 5027.54, 7116.81, 9471.03, 12318.86, 5785.09, 6642.16, 5245.64, 7404.56],
    '人数增长率': [53.21, 31.91, 30.77, 27.47, 23.69, 31.80, 25.75, 25.05, 20.08, 17.10, 41.24, 40.02, 30.16, 17.21, -45.58, 4.30, -23.64, 29.17],
    '旅游收入增长率': [59.39, 32.35, 27.49, 23.29, 31.79, 34.70, 30.13, 27.44, 22.16, 21.30, 43.12, 41.56, 33.08, 30.07, -53.04, 14.82, -21.03, 41.16]
}

data3 = {
    'Year': [2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023],
    '人数增长率': [53.21, 31.91, 30.77, 27.47, 23.69, 31.80, 25.75, 25.05, 20.08, 17.10, 41.24, 40.02, 30.16, 17.21, -45.58, 4.30, -23.64, 29.17],
    '旅游收入增长率': [59.39, 32.35, 27.49, 23.29, 31.79, 34.70, 30.13, 27.44, 22.16, 21.30, 43.12, 41.56, 33.08, 30.07, -53.04, 14.82, -21.03, 41.16],
    '人均旅游收入增长率': [4.04, 0.34, -2.51, -3.28, 6.55, 2.20, 3.49, 1.92, 1.73, 3.59, 1.33, 1.10, 2.25, 10.97, -13.71, 10.08, 3.42, 9.28]
}

data4 = {
    '评分': ['1', '2', '差评', '3', '中评', '4', '5', '好评'],
    '安顺龙宫比例': [5, 3, 8, 9, 0, 19, 63, 83],
    '大方百里杜鹃比例': [1, 1, 1, 8, 0, 21, 70, 91],
    '黄果树瀑布比例': [3, 2, 5, 4, 0, 13, 78, 91],
    '江口梵净山比例': [6, 2, 9, 6, 0, 15, 70, 85],
    '荔波小七孔比例': [1, 0, 1, 4, 0, 11, 84, 95],
    '乌蒙大草原比例': [1, 1, 2, 8, 0, 20, 70, 90],
    '西江千户苗寨比例': [7, 4, 11, 15, 0, 22, 52, 73],
    '镇远古城比例': [4, 2, 6, 8, 0, 21, 66, 87]
}

# 创建DataFrame
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
df3 = pd.DataFrame(data3)
df4 = pd.DataFrame(data4)

# 创建子图布局
fig, axs = plt.subplots(2, 2, figsize=(16, 12),dpi=300)

# 绘制第一个图:旭日图
axs[0, 0].set_title('景区评分旭日图', fontsize=18)

# 不设置 '景区名称' 为索引
colors = ['#ff4500', '#ff6347', '#ff7f50', '#ff8c00', '#ff4500', '#ff6347', '#ff7f50', '#ff8c00']

# 数据准备
wedges, texts, autotexts = axs[0, 0].pie(df1['评分'], autopct='%1.1f%%', startangle=140, colors=colors, 
                                         pctdistance=0.85, wedgeprops=dict(width=0.4, edgecolor='w'), labels=df1['景区名称'])

# 设置饼图为圆形(避免变形)
axs[0, 0].axis('equal')

# 设置中心的圆形
centre_circle = plt.Circle((0,0),0.70,fc='white')
axs[0, 0].add_artist(centre_circle)

# 添加文字标签
for text, color in zip(texts, colors):
    text.set_color(color)
    text.set_fontsize(12)

# 设置autopct的颜色为白色
for autotext in autotexts:
    autotext.set_color('white')
    autotext.set_fontsize(18)

# 移除饼图的线条
for wedge in wedges:
    wedge.set_edgecolor('black')

# 绘制第二个图:渐变堆叠面积图
axs[0, 1].set_title('旅游数据渐变堆叠面积图', fontsize=18)
x = df2['年份'].astype(int)  # 将年份数据转换为整数
colors = plt.cm.viridis(np.linspace(0, 1, len(df2.columns) - 1))  # 使用viridis颜色映射
for i, col in enumerate(df2.columns[1:]):
    y = df2[col]
    axs[0, 1].fill_between(x, 0, y, alpha=0.7, color=colors[i], label=col)
axs[0, 1].legend(title='指标', loc='upper left')

# 设置第二个图的年份轴刻度为整数
axs[0, 1].xaxis.set_major_locator(plt.MaxNLocator(integer=True))
axs[0, 1].set_xticks(x)  # 设置x轴刻度为年份

# 绘制第三个图:排序折线图
axs[1, 0].set_title('增长率排序折线图', fontsize=18)
x = df3['Year'].astype(int)  # 将年份数据转换为整数
axs[1, 0].plot(x, df3['人数增长率'], marker='o', label='人数增长率', linestyle='-', color='blue')
axs[1, 0].plot(x, df3['旅游收入增长率'], marker='o', label='旅游收入增长率', linestyle='-', color='orange')
axs[1, 0].plot(x, df3['人均旅游收入增长率'], marker='o', label='人均旅游收入增长率', linestyle='-', color='green')
axs[1, 0].legend()

# 设置第三个图的年份轴刻度为整数
axs[1, 0].xaxis.set_major_locator(plt.MaxNLocator(integer=True))
axs[1, 0].set_xticks(x)  # 设置x轴刻度为年份

# 绘制第四个图:关系图
axs[1, 1].set_title('评分与各景点比例关系图', fontsize=18)
for column in df4.columns[1:]:
    axs[1, 1].plot(df4['评分'], df4[column], marker='o', label=column)
axs[1, 1].legend()

plt.tight_layout()
plt.savefig('visualization.png', dpi=300, bbox_inches='tight')
plt.show()

代码解释如下:

这段代码是一个 Python 脚本,用于绘制四个子图的数据可视化图形。我将其分为两段解释,首先解释导入库和准备数据的部分,然后解释绘制图形的部分。

导入库和准备数据

  1. 导入库:

    • matplotlib.pyplot:用于绘制图形。
    • seaborn:用于美化图形的外观。
    • pandas:用于数据处理和创建 DataFrame。
    • numpy:用于数值计算。
  2. 设置中文字体和负号:

    • 设置图形中显示的中文字体为楷体,解决中文显示乱码问题。
    • 设置负号的显示格式,避免显示为方块。
  3. 准备数据:

    • data1data2data3data4:这些字典包含了要绘制的四个图形所需的数据。每个字典代表一个 DataFrame 的数据集。
    • 通过这些数据创建了四个 DataFrame:df1df2df3df4

绘制图形

  1. 创建子图布局:

    • 使用 plt.subplots() 创建一个包含 2 行 2 列子图的布局,并指定图形大小和分辨率。
  2. 绘制第一个图(旭日图):

    • 使用 axs[0, 0] 获取第一个子图。
    • 设置子图的标题为 '景区评分旭日图'。
    • 使用 plt.pie() 绘制旭日图,显示不同景区的评分占比。设置了自动标签百分比和颜色。
    • 添加了中心的白色圆形以美化图形。
    • 移除了饼图的线条,以使图形更加清晰。
  3. 绘制第二个图(渐变堆叠面积图):

    • 使用 axs[0, 1] 获取第二个子图。
    • 设置子图的标题为 '旅游数据渐变堆叠面积图'。
    • 使用 plt.fill_between() 绘制渐变堆叠面积图,表示不同年份的旅游人数和收入。
    • 使用 colormap 来显示不同指标的颜色,并添加图例。
    • 设置 x 轴刻度为年份。
  4. 绘制第三个图(排序折线图):

    • 使用 axs[1, 0] 获取第三个子图。
    • 设置子图的标题为 '增长率排序折线图'。
    • 使用 plt.plot() 绘制折线图,显示不同年份的旅游人数增长率、旅游收入增长率和人均旅游收入增长率。
    • 设置 x 轴刻度为年份。
  5. 绘制第四个图(关系图):

    • 使用 axs[1, 1] 获取第四个子图。
    • 设置子图的标题为 '评分与各景点比例关系图'。
    • 使用 plt.plot() 绘制折线图,显示不同景点的评分与比例关系。
    • 添加图例。
  6. 保存和显示图形:

    • 使用 plt.tight_layout() 调整图形布局,以防止重叠。
    • 使用 plt.savefig() 保存图形为文件。
    • 使用 plt.show() 显示图形。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值