数据结构与算法设计-作业5-matplotlib绘图&数据分析可视化

Python数据可视化:matplotlib绘图技巧

T1

使用matplotlib绘制如下函数,
f(x)=[sin(x-2)]2*e(-x^2)
其中x的取值范围为[0, 2]。
要求:
(a) 编写Python代码
(b) 在图中添加合适的轴刻度、轴标签和图名等,并展示结果

思路

计算
x = np.linspace(0, 2, 400) :创建了一个从 0 到 2 之间的 400 个均匀分布的点,用于定义自变量 x 的取值范围。这将用于绘制连续的曲线。
绘图
plt.plot(x, y, label=...) :将 x 和 y 的值绘制成曲线。label 用于设置图例的显示文本,使用 LaTeX 格式显示函数形式,color='b' 设置曲线颜色为蓝色。
y = (np.sin(x - 2))**2 * np.exp(-1*x**2):使用numpy计算y的值。
设置轴的范围:
plt.xlim(0, 2)限制 x 轴的显示范围为 0 到 2。
plt.ylim(0, max(y) * 1.1) 限制 y 轴的显示范围,使其从 0 开始,上限略高于 y 的最大值,以便给图像留出空间。

结果

在这里插入图片描述

T2

根据mrbook.xlsx文件中的数据绘制双y轴可视化数据分析表。

思路

  1. 初始化环境与读取数据

    • 设置中文字体支持,确保负号可以正确显示。
    • 读取 Excel 文件 mrbook.xlsx 的数据,并打印前几行,以快速了解数据结构。数据包含“月份” (x)、销量 (y1)、增长率 (y2) 三列。
  2. 创建图表框架

    • 使用 fig, ax1 = plt.subplots() 创建一个新的图表和主轴 (ax1)。ax1 将用于显示销量数据。
  3. 绘制第一个Y轴数据

    • ax1 上绘制销量数据(y1),以柱状图的形式展示销量随月份的变化。
    • 设置 ax1 的 Y 轴标签为“销量(册)”,颜色为蓝色,并将 Y 轴刻度标签设置为黑色。
  4. 添加第二个Y轴

    • 通过 ax1.twinx() 创建第二个 Y 轴 (ax2),与 ax1 共享 X 轴。
    • 使用折线图在 ax2 上绘制增长率数据(y2),并将 Y 轴标签设置为“增长率”。
    • 为增长率数据添加数据点标注,以红色显示数值,并在图上通过 ax2.annotate() 标出增长率的数值。

结果

在这里插入图片描述

T3

根据mrtb_data.xlsx文件中的数据绘制堆叠柱状图。

思路

  1. 初始化与数据读取

    • 设置列名 header,以便从Excel文件中读取并清晰识别每个字段。
    • 使用 pd.read_excel 读取数据文件 mrtb_data.xlsx,并指定 header,确保数据正确加载到 df
  2. 数据清理和分组

    • 从数据框中选择相关列(类别、性别、总金额)。
    • 根据类别和性别对 总金额 进行分组,并对每组的总金额求和。
    • 通过 unstack() 将性别作为列标签,形成一个包含类别、性别和累计金额的表格,并使用 fillna(0) 填充缺失值。
    # 处理图表数据
    cleaned = df[['类别', '性别', '总金额']]
    grouped = cleaned.groupby(['类别', '性别'])['总金额'].sum().unstack().fillna(0)
    
  3. 设置绘图配置和创建图表

    • 设置中文字体支持,确保中文能够正常显示。
    • 创建一个 figax 对象,定义绘图的尺寸。
    • 设定每个堆叠柱状图的宽度和堆叠之间的间隙。
    # 绘制图片
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用黑体显示中文,防止中文显示不出来
    fig, ax = plt.subplots(figsize=(10, 6))
    
    # 定义宽度和位置
    bar_width = 0.8  # 每个类别的总宽度
    gap = 0.1  # 每个堆叠之间的间隙
    
  4. 绘制堆叠柱状图与数值标注

    • 使用循环绘制“男”和“女”两个类别的堆叠柱状图,并设置不同的颜色。
    • 对每个性别的数值进行堆叠,并在柱状图顶部显示数值。
    • 使用 ax.text() 在每个柱子上方添加标注,显示累计金额的数值。
    # 绘制堆叠柱状图
    for i, gender in enumerate(['女', '男']):
        ax.bar(grouped.index, grouped[gender], width=bar_width, label=gender,
               bottom=grouped.iloc[:, :i].sum(axis=1), linewidth=0.5, edgecolor='white', zorder=3)
    
    # 在每个堆叠条形的顶部显示数值
    for i, gender in enumerate(['女', '男']):
        for idx, val in enumerate(grouped[gender]):
            height = grouped.iloc[idx, :i].sum() + val
            ax.text(idx, height + gap, f'{val:.0f}', ha='center', va='bottom', zorder=5)
    
  5. 图表美化与显示

    • 设置 x 轴的刻度位置和标签,使标签旋转以便于阅读。
    • 设置背景颜色为粉色,添加白色网格线并修改边框颜色为白色。
    • 去除 x 轴和 y 轴的刻度线,但保留刻度值。
    • 添加标题和 y 轴标签,显示图例,并最终调用 plt.show() 显示图表。
    # 设置 x 轴的刻度位置和标签,标签斜着显示
    ax.set_xticks(range(len(grouped.index)))
    ax.set_xticklabels(grouped.index, rotation=30, ha='right')
    
    # 设置背景颜色为粉色
    ax.set_facecolor('lightpink')
    
    # 添加白色网格线
    ax.grid(True, which='both', linestyle='-', linewidth=0.5, color='white', zorder=0)
    
    # 设置表格边框为白色
    ax.spines['top'].set_color('white')
    ax.spines['right'].set_color('white')
    ax.spines['left'].set_color('white')
    ax.spines['bottom'].set_color('white')
    
    # 去掉 x 轴和 y 轴的刻度线,但保留刻度值
    ax.tick_params(axis='x', which='both', length=0)
    ax.tick_params(axis='y', which='both', length=0)
    
    # 添加标题和轴标签
    plt.ylabel('男女分布')
    
    # 显示图例
    plt.legend(['女性用户', '男性用户'])
    
    # 显示图形
    plt.tight_layout()
    plt.show()
    

结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值