首页 > 其他分享 >大数据分析与可视化 之 实验12 Matplotlib绘制图表(二)

大数据分析与可视化 之 实验12 Matplotlib绘制图表(二)

时间:2023-12-30 20:22:57浏览次数:44  
标签:rainy plt set df days Matplotlib 12 可视化 ax

实验12 Matplotlib绘制图表(二)

实验学时:2学时
实验类型:验证
实验要求:必修

一、实验目的

  1. 掌握Matplotlib的框架及图形属性。
  2. 掌握Matplotlib绘制图形的步骤。
  3. 掌握Matplotlib绘制柱形图、条形图、饼图、折线图。
  4. 掌握Matplotlib绘制散点图、等高线图、极坐标图、3D图。

二、实验要求

通过编程实现使用Matplotlib绘制柱形图、条形图、饼图、折线图、散点图、等高线图、极坐标图、3D图,并显示输出。

三、实验内容

任务1. 根据实验10任务1中的结果数据实现:
(1)用厦门市2018年1-6月白天和晚上都是晴天的天数、白天和晚上都是雨天的天数数据绘制对称柱形图
(2)用全年最高温和最低温均不超过10的天数、全年最高温超过30的天数、全年空气质量为优的天数、全年晴天天数、全年雨天天数数据绘制散点图。
(3)用每月雨天数占全年天数的比值绘制一个饼图。
用Python编写程序实现。

任务2.利用tushare模块导出2022年股票代码为“000001”的股票数据,按周汇总计算每周开盘价(monday_open)、收盘价(friday_close)、最高价(week_high)、最低价(week_low)。根据结果数据对开盘价(monday_open)、收盘价(friday_close)、最高价(week_high)、最低价(week_low)绘制折线图。用Python编写程序实现。

任务3. 利用如下等高线函数,绘制如下图所示的热力图。

def f(x, y):
    return (1 - x / 2 + x ** 5 + y ** 3) * np.exp(- x ** 2 - y ** 2)


任务4. 利用如下函数,绘制如下图所示的3D曲面图。

def f(x,y):
return (1-x/2+x**5+y**3)*np.exp(-x**2-y**2)

test12.py

# encoding:utf-8
import numpy as np
import matplotlib as mpl
import matplotlib.pylab as plt
import pandas as pd
import tushare as ts
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.font_manager import FontProperties


def task1():
    mpl.rcParams['font.sans-serif'] = 'SimHei'
    mpl.rcParams['axes.unicode_minus'] = False
    # 读取CSV文件
    df = pd.read_csv("cleaned_xiamen_2018.csv", encoding="utf-8", parse_dates=['日期'], date_parser=lambda
        x: pd.to_datetime(x, format='%Y年%m月%d日'))

    # (1)对称柱形图
    sunny_days = df[(df['日期'].dt.month.isin([1, 2, 3, 4, 5, 6])) & (df['日间天气'] == '晴') & (df['夜间天气'] == '晴')]
    sunny_days_count = sunny_days.groupby(sunny_days['日期'].dt.month).size()
    rainy_days = df[(df['日期'].dt.month.isin([1, 2, 3, 4, 5, 6])) & (df['日间天气'] == '小雨') & (df['夜间天气'] == '小雨')]
    rainy_days_count = rainy_days.groupby(rainy_days['日期'].dt.month).size()
    # 确保两组数据长度相同
    sunny_days_count = sunny_days_count.reindex(range(1, 7), fill_value=0)
    rainy_days_count = rainy_days_count.reindex(range(1, 7), fill_value=0)
    fig, ax = plt.subplots()
    bar_locations = range(1, 7)
    ax.bar(bar_locations, sunny_days_count, label='晴天', color='gold')
    ax.bar(bar_locations, -rainy_days_count, label='雨天', color='lightblue')  # 注意这里取负值
    ax.set_xlabel('月份')
    ax.set_ylabel('天数')
    ax.set_title('1-6月份白天和晚上都是晴天/雨天的天数')
    ax.set_xticks(bar_locations)
    ax.set_xticklabels([f'Month {i}' for i in range(1, 7)])
    ax.legend()
    plt.show()

    # (2)散点图
    # 数据筛选
    temperature_condition = (df['当日最高温度'] <= 10) & (df['当日最低温度'] <= 10)
    high_temperature_condition = df['当日最高温度'] > 30
    air_quality_condition = df['质量等级'] == '优'
    sunny_days_condition = (df['日间天气'] == '晴') & (df['夜间天气'] == '晴')
    rainy_days_condition = (df['日间天气'] == '小雨') & (df['夜间天气'] == '小雨')
    # 统计数据
    temperature_days = df[temperature_condition]
    high_temperature_days = df[high_temperature_condition]
    air_quality_days = df[air_quality_condition]
    sunny_days = df[sunny_days_condition]
    rainy_days = df[rainy_days_condition]
    fig, ax = plt.subplots()
    ax.scatter(temperature_days['日期'], temperature_days['当日最高温度'], label='温度<=10°C', color='blue', marker='o')
    ax.scatter(high_temperature_days['日期'], high_temperature_days['当日最高温度'], label='最高温>30°C', color='red',
               marker='s')
    ax.scatter(air_quality_days['日期'], air_quality_days['当日最高温度'], label='空气质量优', color='green', marker='^')
    ax.scatter(sunny_days['日期'], sunny_days['当日最高温度'], label='晴天', color='orange', marker='d')
    ax.scatter(rainy_days['日期'], rainy_days['当日最高温度'], label='雨天', color='purple', marker='v')
    ax.set_xlabel('日期')
    ax.set_ylabel('最高温度')
    ax.set_title('全年天气情况散点图')
    ax.legend()
    plt.show()

    # (3)饼图
    monthly_rainy_days = df.groupby(df['日期'].dt.month)['日间天气'].apply(lambda x: x[x == '小雨'].count()).tolist()
    fig, ax = plt.subplots()
    labels = [f'第{i + 1}月' for i in range(len(monthly_rainy_days))]
    # 确保 monthly_rainy_days 和 labels 长度一致
    if len(monthly_rainy_days) == len(labels):
        ax.pie(monthly_rainy_days, labels=labels, autopct='%1.1f%%', startangle=90, colors=plt.cm.Paired.colors)
        ax.set_title('每月雨天数占全年比例')
        plt.show()
    else:
        print("错误:monthly_rainy_days 和 labels 的长度不一致。")


def shoupan(zgpa):
    spj = zgpa.set_index(zgpa.index)
    plt.plot(spj['close'])
    plt.title('中国平安每日收盘价')
    plt.show()


# 按周采样输出
def weeko(spj):
    spj_week = spj['close'].resample('W-MON').mean()
    print(spj_week.head(20))
    # 训练数据
    train_data = spj_week['2022': '2022']
    plt.plot(train_data)
    plt.title('股票周收盘价均值')
    plt.show()


def task2():
    mpl.rcParams['font.sans-serif'] = 'SimHei'
    mpl.rcParams['axes.unicode_minus'] = False
    zgpa = ts.get_hist_data('000001')
    zgpa.index = pd.to_datetime(zgpa.index)
    spj = zgpa.set_index(zgpa.index)
    fig = plt.figure(dpi=120, figsize=(5, 3))
    shoupan(zgpa)
    weeko(spj)


# 定义函数
def f(x, y):
    return (1 - x / 2 + x ** 5 + y ** 3) * np.exp(- x ** 2 - y ** 2)


def task3():
    n = 256
    # 定义x,y
    x = np.linspace(-3, 3, n)
    y = np.linspace(-3, 3, n)
    # 生成网格数据
    X, Y = np.meshgrid(x, y)
    # 填充等高线的颜色,8是等高线分为几部分
    plt.contourf(X, Y, f(X, Y), 8, alpha=0.75, cmap=plt.cm.hot)  # cmap=plt.cm.hot映射为热力图
    # 绘制等高线
    C = plt.contour(X, Y, f(X, Y), 8, colors='black', linewidth=0.5)
    # 绘制等高线数据
    plt.clabel(C, inline=True, fontsize=10)
    # 去除坐标轴
    plt.xticks(())
    plt.yticks(())
    plt.show()


def task4():
    font = FontProperties(fname=None, size=14)
    font.set_family('SimHei')
    font.set_name('SimHei')
    font.set_style('normal')

    plt.rcParams['font.sans-serif'] = [font.get_name()]  # 指定默认字体
    plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题

    n = 1000  # 1000*1000的点阵
    x, y = np.meshgrid(np.linspace(-3, 3, n), np.linspace(-3, 3, n))

    fig = plt.figure()
    plt.title('3D曲面图', fontdict={'size': 20, 'color': 'r'})
    ax = fig.add_subplot(111, projection='3d')  # 使用fig.gca方法也可以,但是需要指定projection='3d'参数
    ax.set_xlabel('x轴', fontdict={'size': 14, 'color': 'g'})
    ax.set_ylabel('y轴', fontdict={'size': 14, 'color': 'b'})
    ax.set_zlabel('z轴', fontdict={'size': 14, 'color': 'r'})
    ax.plot_surface(x, y, f(x, y), rstride=10, cstride=10, cmap='jet')
    plt.show()


if __name__ == '__main__':
    task1()
    task2()
    task3()
    task4()

标签:rainy,plt,set,df,days,Matplotlib,12,可视化,ax
From: https://www.cnblogs.com/IvanKK/p/17936753

相关文章

  • 大数据分析与可视化 之 实验06 Pandas缺失值处理
    实验06Pandas缺失值处理实验学时:2学时实验类型:验证实验要求:必修一、实验目的掌握判断缺失值、过滤缺失值、填充缺失缺失值等缺失值处理解决实际数据中的缺失值问题二、实验要求使用常见的缺失值处理函数(如:isnull()、notnull()、fillna()、dropna()函数)等知识在PyCharm......
  • 大数据分析与可视化 之 实验07 Pandas合并与级联
    实验07Pandas合并与级联实验学时:2学时实验类型:验证实验要求:必修一、实验目的掌握pandas合并/拼接掌握pandas级联二、实验要求利用pandas合并、拼接和级联等知识在PyCharm中编写程序,实现Python数据处理的相关操作。三、实验内容任务1.现有如下图的两个DataFrame数据......
  • 大数据分析与可视化 之 实验08 Pandas字符串和文本处理
    实验08Pandas字符串和文本处理实验学时:2学时实验类型:验证实验要求:必修一、实验目的学会正确使用常见的字符串函数如:len()、find()、strip()、replace()、contains()函数。解决实际数据中的字符串和文本处理问题。二、实验要求使用常见的字符串函数(如:len()、find()、s......
  • 大数据分析与可视化 之 实验09 Pandas函数应用
    实验09Pandas函数应用实验学时:2学时实验类型:验证实验要求:必修一、实验目的掌握pandas函数应用的方法:pipe()、apply()和applymap()。能编写自定义函数。能使用pandas函数应用调用自定义函数解决数据分析实际问题。二、实验要求利用pandas函数应用的方法解决数据分析实......
  • 大数据分析与可视化 之 实验02 Numpy创建数组
    实验02Numpy创建数组实验学时:2学时实验类型:验证实验要求:必修一、实验目的掌握Numpy创建数组的方法掌握Numpyndarray的属性、运算掌握Numpy迭代数值,修改数组中元素的值掌握Numpy常用函数的使用方法二、实验要求使用Numpy.array的构造函数创建数组,学会使用Numpyndar......
  • 大数据分析与可视化 之 实验03 Numpy实现数据分析
    实验03Numpy实现数据分析实验学时:2学时实验类型:验证实验要求:必修一、实验目的掌握Numpy的字符串函数掌握Numpy统计函数掌握Numpy排序、分组、线性代数函数二、实验要求通过编程实现使用Numpy字符串函数进行文本处理,使用统计函数进行数据分析等常用操作。三、实验内......
  • *035共情营邱月帮-第17次课(周六晚上-AB对练-)-20231230
      20221212--20221230期间每周一、四、五上正课,三、六是对答疑、对练课。 打开心灵,改变从自己开始,一起抱团取暖。《相信相信的力量》----------------------------------------------------------------------------------------------------------------(周六)-202312......
  • 大数据分析与可视化 之 实验04 Pandas基础
    实验04Pandas基础实验学时:2学时实验类型:验证实验要求:必修一、实验目的1.掌握pandas系列、数据帧和面板的使用2.掌握pandas基本功能和操作二、实验要求Pandas程序的运行步骤。2.pandas的数据结构3.pandas系列、数据帧和面板pandas基本功能和操作三、实验内容任务1.......
  • 2023-12-30
    packagecom.example.backendmanage.controller;importcom.example.backendmanage.common.AjaxResult;importcom.example.backendmanage.info.Role;importcom.example.backendmanage.mapper.RoleMapper;importorg.springframework.beans.factory.annotation.Autowired;imp......
  • 12.30每日总结
    今天将软件企业文化大作业剩下的内容写完了《软件企业文化》大作业个人计划第三部分产品销售摘要:本销售计划书旨在为我们创新的软件产品制定全面的销售策略,以确保产品成功进入市场并取得可观的销售业绩。我们的软件产品旨在满足客户需求,并通过有效的市场推广和销售渠道来实......