# -*- encoding: utf-8 -*- # ----------------------------------------------------------------------------- # @File Name : draw.py # @Time : 2020/11/19 上午10:51 # @Author : X. Peng # @Email : acepengxiong@163.com # @Software : PyCharm # ----------------------------------------------------------------------------- import numpy as np import matplotlib.pyplot as plt from matplotlib import ticker from matplotlib.ticker import FuncFormatter from matplotlib.font_manager import FontProperties # 中文字体初始化 plt.rcParams['font.sans-serif']=['Heiti TC'] def to_percent(temp, position): return '%1.0f' % temp + '%' def draw_month_return_chart(xlabels, product_list, cumulative): """月度回报表现图""" # plt.title('Scores by group and gender') # plt.ylabel('Scores') figsize = (20, 12) # 标签文字大小 fontsize = 20 # 初始化 fig = plt.figure(figsize=figsize) ax1 = fig.add_subplot() ax2 = ax1.twinx() max_x_count = max([x['data'].size for x in product_list]) loc = np.arange(max_x_count) # the x locations for the groups width = 0.35 # the width of the bars: can also be len(x) sequence color_list = ['#222A77', '#6C71AA', '#E1BC95', '#F9DBB8'] # 坐标轴 ax1.tick_params(labelsize=fontsize) ax2.tick_params(labelsize=fontsize) # 坐标轴颜色 ax2.tick_params(axis='y', colors='#C6A774') ax1.set_xticks(loc) ax1.set_xticklabels(xlabels) ax1.yaxis.set_major_formatter(FuncFormatter(to_percent)) ax2.yaxis.set_major_formatter(FuncFormatter(to_percent)) temp_rate = np.zeros(max_x_count) for i in range(len(product_list)): temp_rate += product_list[i]['data'] max_rate = np.max(np.hstack((temp_rate, cumulative['data']))) ax2.set_ylim(0, max_rate + 15) # 柱状图 prod_legend = [] for i in range(len(product_list)): ax = None bottom = np.zeros(max_x_count) if i == 0: ax = ax1.bar(loc, product_list[i]['data'], width, color=color_list[i], alpha=0.8) else: for j in range(i): bottom = bottom + product_list[j]['data'] if i < len(color_list): ax = ax1.bar(loc, product_list[i]['data'], width, bottom=bottom, color=color_list[i], alpha=0.8) else: ax = ax1.bar(loc, product_list[i]['data'], width, bottom=bottom, alpha=0.8) prod_legend.append(ax[0]) ax1.legend(prod_legend, [prod['name'] for prod in product_list], loc='upper left', fontsize=fontsize) # 画折线图 ax2.plot(loc, cumulative['data'], color='#C6A774', marker='', linewidth=3, label=cumulative['name']) ax2.legend(loc='upper center', fontsize=fontsize) plt.show() def draw_contribution_chart(xlabels, product_list, cumulative): """贡献分解图""" # plt.title('Scores by group and gender') # plt.ylabel('Scores') figsize = (20, 12) # 标签文字大小 fontsize = 22 # 初始化 fig = plt.figure(figsize=figsize) ax1 = fig.add_subplot() ax2 = ax1.twiny() max_x_count = max([x['data'].size for x in product_list]) loc = np.arange(max_x_count) # the x locations for the groups width = 0.35 # the width of the bars: can also be len(x) sequence color_list = ['#222A77', '#6C71AA', '#E1BC95', '#F9DBB8'] # 坐标轴 ax1.tick_params(labelsize=fontsize) ax1.set_xticks(loc) ax1.set_xticklabels(xlabels) ax1.yaxis.set_major_formatter(FuncFormatter(to_percent)) temp_rate = np.zeros(max_x_count) for i in range(len(product_list)): temp_rate += product_list[i]['data'] max_rate = np.max(np.hstack((temp_rate, cumulative['data']))) ax2.set_xticks([]) ax2.set_ylim(0, max_rate + 10) # 堆叠柱状图 prod_legend = [] for i in range(len(product_list)): ax = None bottom = np.zeros(max_x_count) if i == 0: ax = ax1.bar(loc, product_list[i]['data'], width, color=color_list[i], alpha=0.8) else: for j in range(i): bottom = bottom + product_list[j]['data'] if i < len(color_list): ax = ax1.bar(loc, product_list[i]['data'], width, bottom=bottom, color=color_list[i], alpha=0.8) else: ax = ax1.bar(loc, product_list[i]['data'], width, bottom=bottom, alpha=0.8) prod_legend.append(ax[0]) ax1.legend(prod_legend, [prod['name'] for prod in product_list], bbox_to_anchor=(0.8, -0.1), ncol=4, fontsize=fontsize) # 画折线图 ax2.plot(loc, cumulative['data'], color='#C6A774', marker='', linewidth=3, label=cumulative['name']) ax2.legend(loc='upper left', fontsize=fontsize) plt.show() def draw_comment_chart(xlabels, source_prod, target_prod): """个基点评图""" figsize = (20, 12) # 标签文字大小 fontsize = 22 # 初始化 fig = plt.figure(figsize=figsize) ax1 = fig.add_subplot() ax2 = ax1.twiny() # ax = plt.gca() # gca:get current axis得到当前轴 # ax.spines['bottom'].set_position(('data', 0)) # data表示通过值来设置x轴的位置,将x轴绑定在y=0的位置 product_list = [source_prod, target_prod] max_x_count = max([x['data'].size for x in product_list]) loc = np.arange(max_x_count) # the x locations for the groups # 坐标轴 ax1.tick_params(labelsize=fontsize) ax2.tick_params(labelsize=fontsize) ax1.set_xticks(loc) ax1.set_xticklabels(xlabels) ax1.yaxis.set_major_formatter(FuncFormatter(to_percent)) max_rate = np.max(np.hstack((source_prod['data'], target_prod['data']))) ax2.set_xticks([]) # 个基折线图 ax1.plot(loc, source_prod['data'], color='#C6A774', marker='', linewidth=3, label=source_prod['name']) ax1.legend(loc='upper left', fontsize=fontsize) # 指数折线图 ax2.plot(loc, target_prod['data'], color='black', marker='', linewidth=3, label=target_prod['name']) ax2.legend(loc='upper center', fontsize=fontsize) plt.show() def draw_combination_chart(xlabels, new_combination, origin_combination, index): """组合对比图""" figsize = (20, 12) # 标签文字大小 fontsize = 22 # 初始化 fig = plt.figure(figsize=figsize) ax1 = fig.add_subplot() ax2 = ax1.twiny() ax3 = ax1.twiny() # ax = plt.gca() # gca:get current axis得到当前轴 # ax.spines['bottom'].set_position(('data', 0)) # data表示通过值来设置x轴的位置,将x轴绑定在y=0的位置 product_list = [origin_combination, new_combination, index] max_x_count = max([x['data'].size for x in product_list]) loc = np.arange(max_x_count) # the x locations for the groups # 坐标轴 ax1.tick_params(labelsize=fontsize) ax2.tick_params(labelsize=fontsize) ax3.tick_params(labelsize=fontsize) ax1.set_xticks(loc) ax1.set_xticklabels(xlabels) ax1.yaxis.set_major_formatter(FuncFormatter(to_percent)) ax2.set_xticks([]) ax3.set_xticks([]) # 新组合折线图 ax1.plot(loc, new_combination['data'], color='#C6A774', marker='', linewidth=3, label=origin_combination['name']) ax1.legend(loc='upper left', fontsize=fontsize) # 原组合折线图 ax2.plot(loc, origin_combination['data'], color='#222A77', marker='', linewidth=3, label=new_combination['name']) ax2.legend(loc='upper center', fontsize=fontsize) # 指数折线图 ax3.plot(loc, index['data'], color='black', marker='', linewidth=3, label=index['name']) ax3.legend(loc='upper right', fontsize=fontsize) plt.show() def draw_correlation_chart(): """相关性分析图""" pass if __name__ == '__main__': # xlabels = ('2020-1', '2020-2', '2020-3', '2020-4', '2020-5', '2020-6', '2020-7', '2020-8', '2020-9', '2020-10', '2020-11', '2020-12') # product = {'name': '月度回报率', 'data': np.array([10, 20, 30, 40, 50, 10, 20, 30, 40, 50, 40, 50])} # contrast = {'name': '同比上涨', 'data': np.array([10, 50, 120, 100, 36, 0, 50, 120, 100, 36, 23, 98])} # draw_month_return_chart(xlabels, [product], contrast) # xlabels = ('2020-1', '2020-2', '2020-3', '2020-4', '2020-5', '2020-6', '2020-7', '2020-8', '2020-9', '2020-10', '2020-11', '2020-12') # product1 = {'name': '塞亚成长1号', 'data': np.array([10, 20, 30, 40, 50, 10, 20, 30, 40, 50, 40, 50])} # product2 = {'name': '塞亚成长2号', 'data': np.array([10, 20, 30, 40, 50, 10, 20, 30, 40, 50, 40, 50])} # product3 = {'name': '塞亚成长3号', 'data': np.array([10, 20, 30, 40, 50, 10, 20, 30, 40, 50, 40, 50])} # product4 = {'name': '塞亚成长4号', 'data': np.array([10, 20, 30, 40, 50, 10, 20, 30, 40, 50, 40, 50])} # product5 = {'name': '塞亚成长5号', 'data': np.array([10, 20, 30, 40, 50, 10, 20, 30, 40, 50, 40, 50])} # product6 = {'name': '塞亚成长6号', 'data': np.array([10, 20, 30, 40, 50, 10, 20, 30, 40, 50, 40, 50])} # product7 = {'name': '塞亚成长7号', 'data': np.array([10, 20, 30, 40, 50, 10, 20, 30, 40, 50, 40, 50])} # product8 = {'name': '塞亚成长8号', 'data': np.array([10, 20, 30, 40, 50, 10, 20, 30, 40, 50, 40, 50])} # product_list = [product1, product2, product3, product4, product5, product6, product7, product8] # cumulative = {'name': '总收益', 'data': np.array([10, 50, 120, 100, 36, 0, 50, 120, 100, 36, 23, 98])} # draw_contribution_chart(xlabels, product_list, cumulative) # xlabels = ('2020-1', '2020-2', '2020-3', '2020-4', '2020-5', '2020-6', '2020-7', '2020-8', '2020-9', '2020-10', '2020-11', '2020-12') # source_prod = {'name': '远澜银杏1号', 'data': np.array([10, 20, 30, 40, 50, 10, 20, 30, 40, 50, 40, 50])} # target_prod = {'name': '上证指数', 'data': np.array([-10, 10, 5, 55, 24, 10, 20, 8, 10, 31, 40, 32])} # draw_comment_chart(xlabels, source_prod, target_prod) xlabels = ('2020-1', '2020-2', '2020-3', '2020-4', '2020-5', '2020-6', '2020-7', '2020-8', '2020-9', '2020-10', '2020-11', '2020-12') new_combination = {'name': '新组合', 'data': np.array([20, 30, 40, 50, 60, 20, 30, 40, 50, 60, 50, 60])} origin_combination = {'name': '原组合', 'data': np.array([10, 20, 30, 40, 50, 10, 20, 30, 40, 50, 40, 50])} index = {'name': '上证指数', 'data': np.array([-10, 10, 5, 55, 24, 10, 20, 8, 10, 31, 40, 32])} draw_combination_chart(xlabels, new_combination, origin_combination, index)