01-作业:多个柱状图的绘制案例
import matplotlib.pyplot as plt
import numpy as np
def build_data():
"""
构建数据
:return:数据
"""
res = np.load("./国民经济核算季度数据.npz")
columns = res["columns"]
values = res["values"]
print(columns)
print(values)
return columns, values
def plot_data(columns, values, min_i, max_i, title, xlabel, ylabel, legend_index, year_index):
"""
:param columns: 列名
:param min_i: 最小的列下标
:param max_i: 最大的列下标
:param title: 标题
:param xlabel: 横轴标题
:param ylabel: 纵轴标题
:param legend_index: 图例
:param values:数据
:param year_index:年份行数下标
:return:
"""
# 设置横轴
x = np.arange(1, max_i - min_i + 2)
# 设置纵轴
height = values[year_index, min_i:(max_i + 1)]
plt.bar(x, height, width=0.5)
# 进行标注
for i, j in zip(x, height):
plt.text(i, j + 100, "%.2f亿元" % j, horizontalalignment='center')
#
# 增加标题
plt.title(title)
#
# 设置横纵轴的标题
plt.xlabel(xlabel)
plt.ylabel(ylabel)
#
# 修改刻度
xticks = [tmp[:legend_index] for tmp in columns[min_i:max_i + 1]]
# 设置刻度
plt.xticks(x, xticks)
def show_data(columns, values):
"""
结果展示
:param columns: 列名
:param values: 数据
:return: None
"""
# 1、创建画布
fig = plt.figure(figsize=(20, 12), dpi=120)
# 支持中文与负号
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
# 添加子图
fig.add_subplot(2, 2, 1)
title = "2000年第一季度各产业生产总值柱状图"
xlabel = "产业"
ylable = "生产总值(亿元)"
plot_data(columns, values, 3, 5, title, xlabel, ylable, legend_index=4, year_index=0)
fig.add_subplot(2, 2, 2)
title = "2017年第一季度各产业生产总值柱状图"
plot_data(columns, values, 3, 5, title, xlabel, ylable, legend_index=4, year_index=-1)
fig.add_subplot(2, 2, 3)
title = "2000年第一季度各行业生产总值柱状图"
xlabel = "行业"
ylable = "生产总值(亿元)"
plot_data(columns, values, 6, 14, title, xlabel, ylable, legend_index=2, year_index=0)
fig.add_subplot(2, 2, 4)
title = "2017年第一季度各行业生产总值柱状图"
plot_data(columns, values, 6, 14, title, xlabel, ylable, legend_index=2, year_index=-1)
# 保存图片
plt.savefig("./2000、2017年第一季度各产业、行业生产总值柱状图.png")
plt.show()
def main():
"""
主函数
:return:
"""
# 构建数据
columns, values = build_data()
# 展示结果
show_data(columns, values)
if __name__ == '__main__':
main()
02-饼图的绘制
import numpy as np
import matplotlib.pyplot as plt
"""
饼图----将各部分全部绘制在同一个饼中,可以提现出各部分的占比
应用场景:
对比各部分的占比情况
也可以对比部分与整体的关系
"""
def build_data():
"""
加载数据
:return:
"""
res = np.load("./国民经济核算季度数据.npz")
# for tmp in res:
# print(tmp)
columns = res['columns']
values = res['values']
return columns, values
def show_data(columns, values):
"""
数据可视化
:param columns: 数据
:param values: 数据
:return: None
"""
# 1、创建画布
plt.figure()
# 支持中文与负号
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
# 2、绘制图形
# 绘制饼图
# 构建绘制饼图的数据
x = values[-1, 3:6]
# explode --->表示各部分距离圆心的半径---也可以理解为 各部分之间的间隙
explode = (0.01, 0.02, 0.01) # 占半径的占比
# labels ---每一项的名称
labels = [tmp[:4] for tmp in columns[3:6]]
# colors --设置颜色
colors = ['pink', 'r', 'y']
# autopct ---用来显示各部分占比
autopct = "%.1f%%"
# pctdistance --- 控制着标注的位置,默认为距离圆心0.6个半径的位置
pctdistance = 0.6
# labeldistance ---控制着名称的位置,默认为距离圆心1.1个半径的位置
labeldistance = 1.1
# radius ---表示饼图的半径
radius = 1.0
plt.pie(x, explode=explode, labels=labels, colors=colors, autopct=autopct, pctdistance=pctdistance,
labeldistance=labeldistance, radius=radius)
# 将饼图由椭圆 变为圆形
# 椭圆里面 有个长轴、短轴 --->长轴=短轴--->圆
plt.axis('equal')
# 增加标题
plt.title("2017年各个产业的增加总值占比情况")
# 设置图例
plt.legend(labels)
# 保存图片
plt.savefig("./2017年各个产业的增加总值占比情况.png")
# 3、图形展示
plt.show()
def main():
"""
主函数
:return:
"""
# 1、构建数据
columns, values = build_data()
print("columns:\n", columns)
print("values :\n", values)
# 2、数据可视化
show_data(columns, values)
if __name__ == '__main__':
main()
03-箱线图绘制
import numpy as np
import matplotlib.pyplot as plt
"""
箱线图---利用最小值、下四分位数、中位数、上四分位数、最大值来进行描述数据
-----可以用来查看数据的是否对称、离散、分布
----别的功能:----借助箱线图分析剔除异常值(远离正常范围的错误的值)
"""
def build_data():
"""
加载数据
:return:
"""
res = np.load("./国民经济核算季度数据.npz")
# for tmp in res:
# print(tmp)
columns = res['columns']
values = res['values']
return columns, values
def show_data(columns, values):
"""
数据可视化
:param columns: 数据
:param values: 数据
:return: None
"""
# 1、创建画布
plt.figure()
# 支持中文与负号
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
# 2、绘制图形
# 绘制箱线图
x = (values[:, 3], values[:, 4], values[:, 5])
# x = (values[:, 3],)
# 缺口
# meanline=True,showmeans=True 同时使用,才能在箱线图上显示出均值
# vert=False ---绘制水平的箱子
# labels 名称
labels = [tmp[:4] for tmp in columns[3:6]]
# sym --异常值的形状
plt.boxplot(x, notch=True, meanline=True, showmeans=True, labels=labels,sym='*')
# plt.boxplot(x, notch=True, meanline=True, showmeans=True)
# 3、图形展示
plt.show()
def main():
"""
主函数
:return:
"""
# 1、构建数据
columns, values = build_data()
print("columns:\n", columns)
print("values :\n", values)
# 2、数据可视化
show_data(columns, values)
if __name__ == '__main__':
main()
# 了解更多:https://matplotlib.org/gallery/index.html
04-pandas的认识
"""
numpy ---科学计算库
结构核心:ndarray
连续内存的、存储单一数据类型的、多维的数组对象
matplotlib---数据可视化库
能绘制2-d、3-d图
绘图三部曲:
1、创建画布
2、绘制图形
3、图形展示
pandas --- 专门用于进行数据处理的库
内部封装了numpy matplotlib部分的功能 ---pandas内部也可以进行统计分析、数据可视化
结构核心:
1、Series
--一维结构
--可以通过一维数组、列表来生成,也可以通过获取dataframe中的一列来生成
--只有行索引,没有列索引
2、DataFrame ---重中之重
---二维结构
---可以通过二维数组、大字典来生成
---既有行索引,又有列索引
3、pannel --三维结构(了解)
"""
import numpy as np
import pandas as pd
# 加载数据
res = np.load("./国民经济核算季度数据.npz")
columns = res['columns']
values = res['values']
print("columns :\n", columns)
print("values :\n", values)
# 将columns与 values 拼接成一个二维数组
# data = np.vstack((columns,values))
# print("data:\n",data)
# 构建df 的行名称
index_content = ["index_" + str(i) for i in range(values.shape[0])]
print("index_content:\n", index_content)
# 将二维数组转化为dataframe
# dataframe 相比于二维数组,多了行名称(行索引)、列名称(列索引)
df = pd.DataFrame(
data=values,
columns=columns,
index=index_content
)
print("df:\n", df)
print("df 的类型:\n", type(df))
# 自己创建dataframe
# 利用大字典创建dataframe
# df = pd.DataFrame(
# data={
# "name": ['zs', 'ls', 'ww', 'oo', 'hh', 'jj', 'gg', 'kk'],
# "high": [178.0, 179, 165.5, 160.5, 168.6, 172.0, 182, 189.0],
# "score": [99, 98, 97, 90, 89, 99, 96.5, 88.5],
# 'class': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'],
# 'group': ['1', '1', '2', '2', '1', '1', '2', '2']
# },
# index=["stu_1", "stu_2", "stu_3", "stu_4", "stu_5", "stu_6", "stu_7", "stu_8"]
# )
# print("df:\n", df)
# print("df 的类型:\n", type(df))
# 获取 df里面的时间这一列
# 从df中取出一列,就是Series,只有行名称,没有列名称
# se = df['时间']
# print("se:\n",se)
# print("se 的类型:\n",type(se))
# 自己创建一个series
# 利用列表、一维数组来生成series
se = pd.Series(
data=np.array(['zs', 'ls', 'ww', 'oo', 'hh', 'jj', 'gg', 'kk']),
index=["stu_1", "stu_2", "stu_3", "stu_4", "stu_5", "stu_6", "stu_7", "stu_8"]
)
print("se:\n", se)
print("se 的类型:\n", type(se))
05-panda对于文件的保存和读取
import pandas as pd
"""
1、文本文件 ----由若干行字符构成的计算机文件,它是一种典型的顺序文件
csv文件---默认以逗号分隔的一种文本文件
2、excel文件--
以.xlsx 、.xls为结尾的表格文件
"""
# sep ,delimiter ---分隔符
# 读取文本文件
# data = pd.read_table(
# filepath_or_buffer="./meal_order_info.csv", # 路径+ 名称
# delimiter=",", # 分隔符
# header='infer', # 列名称为自动识别
# # header=0, # 可以手动的指定某一行为列名称
# encoding="ansi", # 编码格式
# # usecols=[0, 1], # 可以指定只读取指定的列
# # index_col=0, # 指定某一列 为行索引
# nrows=5, # 指定读取前n行数据
# )
# 其它的参数可以参考 read_table
# data = pd.read_csv(
# filepath_or_buffer="./meal_order_info.csv", # 路径+ 名称
# encoding='ansi'
# )
# 加载excel文件
data = pd.read_excel(
io="./meal_order_detail.xlsx", # 路径+ 名称
sheetname=0, # 读取的表的序号
header=0, # 列索引名称
# index_col # 可以指定某一列为行索引
# parse_cols=[0, 1] # 某些版本起作用,可以用来读取指定的列
)
print("data:\n", data)
print("data 的类型:\n", type(data))
# pandas中的读取操作---pd.read_xxxx()
# pandas 中的保存操作---df.to_xxx()
# 将data 保存为csv文件
# data.to_csv(
# path_or_buf="./jj.csv", # 保存的文件的路径+ 名称
# sep=',', # 分隔符
# header=False, # 保存的时候保存列名称 # 置为False 则不保存列名称
# index=False, # 保存的时候保存行名称 # 置为False 则不保存行名称
# mode='a', # 重写模式
# )
06-dataframe属性
import pandas as pd
# 加载detail
data = pd.read_excel("./meal_order_detail.xlsx")
# print("data:\n", data)
# print("data 的类型:\n", type(data))
# print("*" * 100)
# values index columns dtypes size ndim shape
# print("data 的维度:\n", data.ndim)
# print("data 的形状:\n", data.shape)
# print("data 的元素的个数:\n", data.size)
# print("data 的行索引:\n",data.index)
# print("data 的列索引:\n",data.columns)
# pd.DataFrame 将二维数组转化为df, 也可以通过df.values 将df转化为二维数组
# print("data 的values :\n", data.values)
# print("data 的values的类型 :\n", type(data.values))
# 返回每一列的元素的数据类型
# print("data 的元素的数据类型:\n", data.dtypes)
# 构建series
se = data['dishes_name']
print('se:\n', se)
print("se 的类型:\n", type(se))
print("se 的形状:\n", se.shape)
print("se 的维度:\n", se.ndim)
print("se 的元素个数:\n", se.size)
print("se 的元素的数据类型:\n", se.dtypes)
print("se 的values \n", se.values)
print("se 的行索引 :\n", se.index)
07-dataframe的查询操作
import pandas as pd
# 加载detail
data = pd.read_excel("./meal_order_detail.xlsx")
data.index = ["index_" + str(i) for i in range(data.shape[0])]
print('data:\n', data)
print('data 的列索引名称:\n', data.columns)
print("*" * 100)
# dataframe 索引的第一种方式 ---先列后行 ---先后索引
# 获取某一列元素--dishes_name
# print("获取 dishes_name 列:\n", data['dishes_name'])
# 获取某一列元素的 前n行数据 --下标切片
# print('获取单列的 前n行数据:\n', data['dishes_name'][:5])
# 获取某一列元素的 前n行数据 ---head()
# print('获取单列的 前n行数据:\n', data['dishes_name'].head(10))
# 获取某一列元素的 后 n行数据 ---下标切片
# print('获取某一列元素的 后 n行数据:\n', data['dishes_name'][-5:])
# 获取某一列元素的 后 n行数据 ---tail()
# print('获取某一列元素的 后 n行数据:\n', data['dishes_name'].tail(10))
# 获取某一列元素的 前n行数据 --- 行名称列表
# print('获取单列的 前n行数据:\n', data['dishes_name'][['index_0', 'index_1', 'index_2']])
# 获取某一列元素的 前n行数据 ---行名称切片
# print('获取单列的 前n行数据:\n', data['dishes_name']['index_0':'index_2'])
# 获取多列元素---dishes_name detail_id order_id
# print("获取多列元素 :\n",data[['dishes_name','detail_id','order_id']])
# 获取多列元素的前n行 ---下标切片 --后n行---下标切片
# print("获取多列元素的前n行 :\n",data[['dishes_name','detail_id','order_id']][:5])
# 获取多列元素的前n行 ---head() ---后n 行tail
# print("获取多列元素的前n行 :\n", data[['dishes_name', 'detail_id', 'order_id']].head(10))
# 注意:::: ----获取多列元素的前n行 --不可以使用 行名称列表
# print("获取多列元素的前n行 :\n", data[['dishes_name', 'detail_id', 'order_id']][['index_0', 'index_1', 'index_2']]) # 不能使用
# 获取多列元素的前n行 ------行名称切片
# print("获取多列元素的前n行 :\n", data[['dishes_name', 'detail_id', 'order_id']]['index_0':'index_2'])
08-dataframe的增加操作
import pandas as pd
# 加载users
data = pd.read_excel('./users.xlsx')
print("data:\n", data)
print('data 的列索引:\n', data.columns)
# 给data 添加一列 next_year_age
# data['next_year_age'] = data['age'] + 1
data.loc[:,'next_year_age'] = data.loc[:,'age'] + 1
print(data)