# -*- encoding: utf-8 -*- # ----------------------------------------------------------------------------- # @File Name : radar_chart.py # @Time : 2020/12/1 下午4:50 # @Author : X. Peng # @Email : acepengxiong@163.com # @Software : PyCharm # ----------------------------------------------------------------------------- import base64 import os import time import uuid from io import BytesIO import imgkit import pyecharts.options as opts from pyecharts.charts import Radar import cv2 import numpy as np from app.api.engine import template_folder def gen_radar_chart(radar_chart_data): """ Gallery 使用 pyecharts 1.1.0 参考地址: https://echarts.apache.org/examples/editor.html?c=radar 目前无法实现的功能: 1、雷达图周围的图例的 textStyle 暂时无法设置背景颜色 """ radar_chart = radar_chart_data['data'][0:5] v1 = [[data['data'] for data in radar_chart]] radar = Radar( init_opts=opts.InitOpts(bg_color="#fff", animation_opts=opts.AnimationOpts(animation=False))).add_schema( schema=[ opts.RadarIndicatorItem(name="绝对收益", max_=100), opts.RadarIndicatorItem(name="基金经理", max_=100), opts.RadarIndicatorItem(name="极端风险", max_=100), opts.RadarIndicatorItem(name="风险调整后收益", max_=100), opts.RadarIndicatorItem(name="业绩持续性", max_=100), ], # schema=[ # opts.RadarIndicatorItem(name=data['name'], max_=float(data['data'])) for data in radar_chart # ], splitarea_opt=opts.SplitAreaOpts( is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1, color=[ 'rgba(194, 194, 194, 0.5)', 'rgba(232, 232, 232, 1)', 'rgba(242, 242, 242, 1)', 'rgba(247, 247, 247, 0.92)', 'rgba(247, 247, 247, 0.5)', ]) ), textstyle_opts=opts.TextStyleOpts(color="#000", font_size=14), ).add( series_name="预算分配(Allocated Budget)", data=v1, linestyle_opts=opts.LineStyleOpts(width=2, color="#999999"), tooltip_opts=None ).set_series_opts(label_opts=opts.LabelOpts(is_show=False)).set_global_opts( # title_opts=opts.TitleOpts( # title="综合评分", subtitle=radar_chart_data['data'][5]['data'], pos_top="center", pos_left="46%", # title_textstyle_opts={'color': '#333', # 'fontSize': 18, # 'lineHeight': 20, # 'fontWeight': 'normal' # }, # subtitle_textstyle_opts={'color': '#983612' if float(radar_chart_data['data'][5]['data']) > 60 else '#22999F', # 'fontSize': 20, # 'lineHeight': 23, # 'fontWeight': 'bolder', # }), legend_opts=opts.LegendOpts(selected_mode=False, is_show=False) ) # radar.render("basic_radar_chart.html") # img_content = work_dir + "/app/html/{}.png".format(str(uuid.uuid4())) # make_snapshot(snapshot, "basic_radar_chart.html", img_content, delay=2) html = radar.render_embed() start = time.time() image_bin = imgkit.from_string(html, None) print('propose_fund cost', time.time() - start) # 读取图片 img1 = np.frombuffer(image_bin, np.uint8) img = cv2.imdecode(img1, cv2.IMREAD_ANYCOLOR) # 获取宽度和高度 height = len(img) width = len(img[0]) img = img[0:height, 160:750] # img_bin = cv2.imencode(".png", img)[1].tobytes() # img_content = 'data:image/png;base64,' + base64.b64encode(img_bin).decode('utf-8') # return img_content filename = str(uuid.uuid4()) + '.png' filepath = template_folder + filename cv2.imwrite(filepath, img) return filepath if __name__ == '__main__': gen_radar_chart()