#%%
# CY3761 | 2022-01-15 13:54
#%%
# 此为 jupyter 模版, 执行 build 后记住先执行-全部运行
# 使用 DataSpell 进行编写文档
# 变量名、函数名小写分段处理
#%%
# 导入项
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import types
# 设置全局参数
plt.rcParams['font.family'] = plt.rcParams['font.sans-serif'] = 'SimHei' # 设置字体 国标黑体中文字体
plt.rcParams['axes.unicode_minus'] = False ## 设置正常显示符号
np.array((np, pd, plt))
#%%
class JsonObject:
def __init__(self, items):
self.items = items
def __getattribute__(self, name: str): # 注意这个方法有个坑里面不能写入 self.* 否则会出现 循环调用
return object.__getattribute__(self, 'items').get(name)
def print_data(o, head=True):
o_items = dict(shape=None,size=None, index=None,columns=None, dtype=None,dtypes=None,)
print('type\t: %s' % type(o))
for (k,v) in o_items.items():
try:
o_items[k] = eval(f'o.{k}')
except (Exception, BaseException):
pass
if k == 'dtypes':
o_items[k] = {k:str(v) for k,v in dict(o_items[k]).items() }
print('%s\t: %s' % (k, o_items[k]))
print()
objs = o
if head:
objs = objs.head(head if type(head) is int else 5) # 这里不能 isinstance(head, int) 布尔值也是返回True
display(objs)
def get_new_file_path(file_path, string, file_ext=None):
file_sep = '.'
file_path_split = file_path.split(file_sep)
file_path_split_pop = file_path_split.pop() # 获取最后一个
file_ext = file_path_split_pop if not file_ext else file_ext
return file_sep.join(file_path_split) + '-' + string + file_sep + file_ext
r_rang = 26
r_chr = {k: [chr(_) for _ in range(size, size+r_rang)] for k,size in dict(b=65, s=97).items()} # 大写字母索引 小写字母索引
r_chr = pd.DataFrame(r_chr, index=range(1, r_rang+1)) # 字母表 b: 大写 s: 小写 1 开始
def get_chr_items(k, f):
k = k.lower()
f = f.upper() if k == 'b' else f.lower()
return tuple(r_chr[k][:list(r_chr[k]).index(f) + 1])
display(r_chr.T)
r_df = pd.DataFrame(np.random.randint(0, 100, (10, 10)), tuple(r_chr.b[:10]), tuple(r_chr.s[:10]))
# print_data(r_df)
def run_plt(ak_plt_items):
ret_items = {}
for _ in ak_plt_items:
if isinstance(_, types.FunctionType):
_()
if isinstance(_, tuple):
# (lambda _: plt.gca(), (None,), 'ax') # 获取当前视图 | 回调函数 回调参数(元祖) 返回变量
a, b, c = _
if b is None:
b = []
b = list(b)
b.append(ret_items)
if isinstance(c, str):
ret_items.setdefault(c, a(*b))
else:
a(*b)
pass
plt_items = [] # 初始化图表数据
#%% md
# 数据可视化入门
#%% md
## 图例
#%%
x = np.linspace(0, 2*np.pi)
print(x.shape)
x.reshape((-1, x.shape[0])).round(2)
#%%
y1 = np.sin(x) # 正弦
print(y1.shape)
y1.reshape(-1, y1.shape[0]).round(2)
#%%
plt_items.append(lambda : plt.figure(figsize=(9, 6))) # 调整尺寸
plt_items.append(lambda : plt.plot(x, y1)) # 绘制线形图
run_plt(plt_items) # 执行
#%%
y2 = np.cos(x) # 余弦
print(y2.shape)
y2.reshape((-1, y2.shape[0])).round(2)
#%%
# 在一个图表中进行多个项 需要用到图例进行区别
plt_items.append(lambda : plt.plot(x, y2))
plt_items.append(lambda : plt.legend( # 图例 | 图例名字 | fontsize 字体尺寸 | loc 对齐方式 | ncol 列数 |
('sin', 'cos'), fontsize=18, loc='center', ncol=2, bbox_to_anchor = (0, 1, 1, 0.2) # w=1占满宽度
))
run_plt(plt_items)
#%%
y3 = y1 + y2 # 正弦+余弦
print(y3.shape)
pd.DataFrame({
'sin': y1,
'cos': y2,
'sin+cos': y3
}).T.round(2)
#%%
plt_items.append(lambda : plt.plot(x, y3)) # 第三条线
plt_items.append(lambda : plt.legend( # 图例 这个必须后面没有再画图操作 | 图例名字 | fontsize 字体尺寸 | loc 对齐方式 | ncol 列数 默认图例一列显示 | bbox_to_anchor 给的位置
# bbox_to_anchor = (x, y, width, height) | 左下角 0,0 右上角 1,1
('sin', 'cos', 'sin+cos'), fontsize=18 # , loc='center', ncol=3, bbox_to_anchor = (0, 1, 1, 0.2) | 不给位置参数 默认右下角
))
run_plt(plt_items)
#%% md
## 脊柱移动
#%%
x = np.linspace(-np.pi, np.pi, 50)
y1 = np.sin(x)
y2 = np.cos(x)
pd.DataFrame(dict(x=x, sin=y1, cos=y2)).round(2).T
#%%
plt_items = [plt_items[0], lambda: plt.plot(x, y1, x, y2)] # plt_items[0] 图表尺寸 | xy 成对出现 当出现多对 表示画多个项
run_plt(plt_items)
#%%
plt_items.extend((
(lambda *_: plt.gca(), None, 'ax'), # 获取当前视图 | 如果传入元祖 参入必须三个参数 | 回调函数 回调参数(元祖) 返回变量
# (lambda *_: _[-1].get('ax').spines['right'].set_color('white'), None, None), # 右边追逐 脊柱消失
# (lambda *_: _[-1].get('ax').spines['top'].set_color('#FFFFFF'), None, None), # 上面的追逐 脊柱消失
# 上面两句可以设置 alpha(0)
(lambda *_: _[-1].get('ax').spines['right'].set_alpha(0), None, None), # 右边追逐 脊柱消失
(lambda *_: _[-1].get('ax').spines['top'].set_alpha(0), None, None) # 上面的追逐 脊柱消失
))
run_plt(plt_items)
#%%
# 设置下面左边脊柱位置 data 表示数据 axes表示相对位置0=1
plt_items.extend((
(lambda *_: plt.gca(), None, 'ax'), # 获取当前视图 | 元祖参入必须三个参数 回调函数 回调参数(元祖) 返回变量
(lambda *_: _[-1].get('ax').spines['bottom'].set_position(('data', 0)), None, None), # 右边追逐 脊柱消失 | 移动到 水平坐标 0位置
(lambda *_: _[-1].get('ax').spines['left'].set_position(('data', 0)), None, None), # 上面的追逐 脊柱消失 | 移动到 垂直坐标 0位置
lambda : plt.yticks((-1,0,1), labels=('-1', 0, 1), fontsize=18),
lambda : plt.xticks(
(-np.pi, -np.pi/2, np.pi/2, np.pi),
labels=(
r'$-\pi$',
r'$-\frac{\pi}{2}$',
r'$\frac{\pi}{2}$',
r'$\pi$',
),
fontsize=18),
))
run_plt(plt_items)
#%%
## 图片保存 需要在列表中设置 因为程序运行都是回调函数
# plt_items[0] = plt.figure(figsize=(9, 6), facecolor='green') # 边框颜色 facecolor
plt_items.append((lambda *_: _[-1].get('ax').set_facecolor('#EEE'), None, None)) # 整个背景颜色都绿了 灰色
plt_items.append(lambda : plt.grid(linestyle='--')) # 网格线 虚线
plt_items.append(lambda : plt.savefig('03.png', dpi=300)) # 图像像素密度 默认 100 | 其他图片格式 pdf 也可以
run_plt(plt_items)
#%%
# 颜色获取
cm = np.array(plt.colormaps())
cm.reshape((-1, cm.shape[0]))
#%%