y = [] for i in data.loc[:, ["chicknum"]].values.tolist(): y.append(int(i[0])) z = [] for i in data.loc[:, ["title"]].values.tolist(): z.append(i[0]) (Scatter(init_opts=opts.InitOpts(width="1600px", height="700px")).add_xaxis( xaxis_data=x).add_yaxis( series_name="点击数", y_axis=[list(i) for i in zip(y, z)], symbol_size=15, label_opts=opts.LabelOpts(is_show=True), ).set_series_opts().set_global_opts( title_opts=opts.TitleOpts(title="学院官网通知点击数"), xaxis_opts=opts.AxisOpts( type_="time", splitline_opts=opts.SplitLineOpts(is_show=True)), yaxis_opts=opts.AxisOpts( type_="value", axistick_opts=opts.AxisTickOpts(is_show=True), splitline_opts=opts.SplitLineOpts(is_show=True), ), tooltip_opts=opts.TooltipOpts(formatter=JsCode( "function (params) {return '标题 : ' + params.value[2];}")), visualmap_opts=opts.VisualMapOpts(type_="color", max_=5000, min_=0, dimension=1), ).render("showChickNum.html"))
def stack_bar_percent() -> Bar: list2 = [ { "value": 12, "percent": 12 / (12 + 3) }, { "value": 23, "percent": 23 / (23 + 21) }, { "value": 33, "percent": 33 / (33 + 5) }, { "value": 3, "percent": 3 / (3 + 52) }, { "value": 33, "percent": 33 / (33 + 43) }, ] list3 = [ { "value": 3, "percent": 3 / (12 + 3) }, { "value": 21, "percent": 21 / (23 + 21) }, { "value": 5, "percent": 5 / (33 + 5) }, { "value": 52, "percent": 52 / (3 + 52) }, { "value": 43, "percent": 43 / (33 + 43) }, ] c = (Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT)).add_xaxis([ 1, 2, 3, 4, 5 ]).add_yaxis( "product1", list2, stack="stack1", category_gap="50%" ).add_yaxis( "product2", list3, stack="stack1", category_gap="50%" ).set_series_opts(label_opts=opts.LabelOpts( position="right", formatter=JsCode( "function(x){return Number(x.data.percent * 100).toFixed() + '%';}" ), ))) return c
def genGeo(data): c = ( Geo(init_opts=opts.InitOpts( width='1800px', height='1000px', bg_color='#0F1C3C', )) .add_schema( maptype='china', itemstyle_opts=opts.ItemStyleOpts( border_color=JsCode( """ new echarts.graphic.LinearGradient(0, 0, 0, 1, [{ offset: 0, color: '#00F6FF' }, { offset: 1, color: '#53D9FF' }], false) """ ), color0='rgba(10,76,139,1)', border_width=1.0, opacity=0.8, color="#012366", ), label_opts=opts.LabelOpts( is_show=False, color='rgba(255,144,128,1)', ), emphasis_itemstyle_opts=opts.ItemStyleOpts( area_color='rgba(0,0,0,0)' ), emphasis_label_opts=opts.LabelOpts( is_show=False ), zoom=1.2, ) .add( # 添加散点图 "", data, symbol_size=20, color='#EA7552', label_opts=opts.LabelOpts( is_show=True, color="#0f0", border_width=2., font_size=18, position="inside", formatter=JsCode( """ function f(param){ return param.name + ','+ param.value[2]/10 } """ ), ) ) .set_series_opts( range_size=[12, 40], itemstyle_opts=opts.ItemStyleOpts( border_width=1.0, border_color='#215495', ), areastyle_opts=opts.AreaStyleOpts( color={ "x": 0, "y": 0, "x2": 0, "y2": 1, "colorStops": [{ "offset": 0, "color": '#073684' }, { "offset": 1, "color": '#061E3D' }], } ) ) .set_global_opts( title_opts=opts.TitleOpts( title="全国本科院校分布图", pos_left='40%', pos_top='10%', title_textstyle_opts=opts.TextStyleOpts( color='white', font_size=20 ) ), visualmap_opts=opts.VisualMapOpts( is_show=False, type_='size', min_=4*10, max_=80*10, ), legend_opts=opts.LegendOpts( is_show=False ), tooltip_opts=opts.TooltipOpts( trigger="item", formatter=JsCode( """ function f(param){ return param.name + ','+ param.value[2]/10 } """ ) ) ) .render("university-geo.html") )
from pywebio.output import put_html from pyecharts import options as opts from pyecharts.charts import Bar, Timeline from pyecharts.commons.utils import JsCode from pyecharts.faker import Faker x = Faker.choose() tl = Timeline() for i in range(2015, 2020): bar = (Bar().add_xaxis(x).add_yaxis("商家A", Faker.values()).add_yaxis( "商家B", Faker.values()).set_global_opts( title_opts=opts.TitleOpts("某商店{}年营业额 - With Graphic 组件".format(i)), graphic_opts=[ opts.GraphicGroup( graphic_item=opts.GraphicItem( rotation=JsCode("Math.PI / 4"), bounding="raw", right=100, bottom=110, z=100, ), children=[ opts.GraphicRect( graphic_item=opts.GraphicItem(left="center", top="center", z=100), graphic_shape_opts=opts.GraphicShapeOpts( width=400, height=50), graphic_basicstyle_opts=opts.GraphicBasicStyleOpts( fill="rgba(0,0,0,0.3)"), ),
def get_images(x_data, y_data, filename_, series_name='x1_dist'): plot_line_path = '.' filename = plot_line_path + filename_ background_color_js = ( "new echarts.graphic.LinearGradient(0, 0, 0, 1, " "[{offset: 0, color: '#c86589'}, {offset: 1, color: '#06a7ff'}], false)" ) area_color_js = ( "new echarts.graphic.LinearGradient(0, 0, 0, 1, " "[{offset: 0, color: '#eb64fb'}, {offset: 1, color: '#3fbbff0d'}], false)" ) c = (Scatter(init_opts=opts.InitOpts(bg_color=JsCode( background_color_js))).add_xaxis(xaxis_data=x_data).add_yaxis( series_name=series_name, y_axis=y_data, is_smooth=True, is_symbol_show=True, symbol="circle", symbol_size=6, linestyle_opts=opts.LineStyleOpts(color="#fff"), label_opts=opts.LabelOpts(is_show=True, position="top", color="white"), itemstyle_opts=opts.ItemStyleOpts(color="red", border_color="#fff", border_width=3), tooltip_opts=opts.TooltipOpts(is_show=False), areastyle_opts=opts.AreaStyleOpts(color=JsCode(area_color_js), opacity=1), ).set_global_opts( title_opts=opts.TitleOpts( title="show %s in one image" % series_name, pos_top="5%", pos_left="center", title_textstyle_opts=opts.TextStyleOpts(color="#fff", font_size=16), ), xaxis_opts=opts.AxisOpts( type_="category", boundary_gap=False, axislabel_opts=opts.LabelOpts(margin=30, color="#ffffff63"), axisline_opts=opts.AxisLineOpts(is_show=False), axistick_opts=opts.AxisTickOpts( is_show=True, length=25, linestyle_opts=opts.LineStyleOpts(color="#ffffff1f"), ), splitline_opts=opts.SplitLineOpts( is_show=True, linestyle_opts=opts.LineStyleOpts(color="#ffffff1f")), ), yaxis_opts=opts.AxisOpts( min_='dataMin', type_="value", position="right", axislabel_opts=opts.LabelOpts(margin=20, color="#ffffff63"), axisline_opts=opts.AxisLineOpts( linestyle_opts=opts.LineStyleOpts(width=2, color="#fff")), axistick_opts=opts.AxisTickOpts( is_show=True, length=15, linestyle_opts=opts.LineStyleOpts(color="#ffffff1f"), ), splitline_opts=opts.SplitLineOpts( is_show=True, linestyle_opts=opts.LineStyleOpts(color="#ffffff1f")), ), datazoom_opts=[ opts.DataZoomOpts(range_start=0, range_end=100), opts.DataZoomOpts(type_="inside", range_start=0, range_end=100), ], legend_opts=opts.LegendOpts(is_show=False), )) c.render(filename)
def anylize_to_html_01(data={}, info=''): from pyecharts import options as opts from pyecharts.commons.utils import JsCode from pyecharts.charts import Scatter, Bar, Timeline, Line, Page, Tab from pyecharts.components import Table tab0 = Tab() data.loc[(data['max_back_1'] != 0), '赢撤比'] = -1 * data['end_1'] / data['max_back_1'] data.loc[(data['max_back_1'] == 0), '赢撤比'] = 0 data = data[data['end_1'] != 0] clm = list(set(data['celue_name'].tolist())) print(clm) title = f'所有参数的,每个指标的统计状态:' tjdf = pd.DataFrame() i = 0 tj_index = { 'end_1': '最终收益', 'sharp_rate_1': '夏普率', 'max_back_1': '最大回撤', 'win_rate_2': '胜率', 'trade_nums_1': '交易次数', 'profit_days_1': '盈利天数', '赢撤比': '赢撤比' } s_tj_index = [] for clm0 in clm: print(clm0) df = data[data['celue_name'] == clm0].copy() for k, v in df.groupby('para1'): print(k) index_0 = i + 1 i = i + 1 tjdf.loc[index_0, 'para1'] = k tjdf.loc[index_0, 'clm'] = clm0 for tj_ix in tj_index.keys(): tjdf.loc[index_0, tj_index[tj_ix]] = v[tj_ix].mean() tjdf.loc[index_0, '赢撤比2'] = -1 * v['end_1'].mean( ) / v['max_back_1'].mean() if v['max_back_1'].mean() != 0 else 0 print(tjdf) print(tjdf.keys()) tj_index2 = list(tjdf.keys()) tj_index2.remove('para1') tj_index2.remove('clm') clm2 = tj_index2 for x, clm0 in enumerate(clm): df0 = tjdf[tjdf['clm'] == clm0].copy() tl = Timeline() for k, i in enumerate(tj_index2): xdata, ydata1 = df0['para1'], df0[['para1', i]] print(xdata) print(ydata1) # exit() bar0 = (Bar().add_xaxis(xdata.tolist()).add_yaxis( '均值', ydata1.values.tolist(), label_opts=opts.LabelOpts(is_show=False, ), ).set_global_opts( xaxis_opts=opts.AxisOpts( offset=0, name='参数名:', type_="value", is_show=True, axistick_opts=opts.AxisTickOpts(is_show=True)), yaxis_opts=opts.AxisOpts( offset=0, name='均值:', type_="value", axistick_opts=opts.AxisTickOpts(is_show=True)), title_opts=opts.TitleOpts(title=f"{title}==:{i}"), legend_opts=opts.LegendOpts(pos_right=True), tooltip_opts=opts.TooltipOpts(formatter=JsCode( "function (params) { return '==para1:'+params.value[0] +' <br/>== 指标:'+ params.value[1]}" ), ), )) tl.add(bar0, f"{i}") tab0.add(tl, clm0) for x, clm0 in enumerate(clm2): tl = Timeline() tjdf0 = tjdf[tjdf['最终收益'] != 0].copy() tjdf0.sort_values(clm0, ascending=True, inplace=True) df0 = tjdf0.iloc[-1 * int(tjdf0.shape[0] * 0.12):].copy() index_list = list(df0.keys()) index_list.remove('clm') df0 = df0[index_list] for k, i in enumerate(index_list): xdata, ydata1 = df0['para1'], df0[[i, 'para1']] print(ydata1) sca0 = (Scatter().add_xaxis(xdata.tolist()).add_yaxis( '分布值', ydata1.values.tolist(), label_opts=opts.LabelOpts(is_show=False, ), ).set_global_opts( xaxis_opts=opts.AxisOpts( offset=0, name='参数名:', type_="value", is_show=True, axistick_opts=opts.AxisTickOpts(is_show=True)), yaxis_opts=opts.AxisOpts( offset=0, name='分布值:', type_="value", axistick_opts=opts.AxisTickOpts(is_show=True)), title_opts=opts.TitleOpts(title=f"{title}==:{i}"), legend_opts=opts.LegendOpts(pos_right=True), tooltip_opts=opts.TooltipOpts(formatter=JsCode( "function (params) { return '==para1:'+params.value[0] +' <br/>== 指标:'+ params.value[1]}" ), ), )) tl.add(sca0, f"{i}") tab0.add(tl, clm0) tab0.render(f"{info}.html") print(f"{info}.html") return
line_color_js = """ new echarts.graphic.LinearGradient( 0,0,0,1, [{offset: 0, color: '#2e9afe'}, { offset: 0.3, color: '#01a9db'}, { offset: 0.6, color: '#f5bca9'}, { offset: 1, color: '#b40404'}] ) """ # 执行绘图 knowledgeGraph = (Graph().set_global_opts(title_opts=opts.TitleOpts( title="Python知识图谱")).add( series_name="", links=linkList, nodes=nodeList, layout="circular", is_rotate_label=True, linestyle_opts=opts.LineStyleOpts(color=JsCode(js_code=line_color_js), curve=0.3, width=1.5), itemstyle_opts=opts.ItemStyleOpts(color="#474747")).render( path=os.path.join(resultPath, resultFileName)))
"rating": movie["rating"] }) data_pair = [] tooltip = {} for i in range(len(genres)): data_pair.append([genres[i], len(meta_data[i])]) tmp = sorted([[ t["title"].replace("\"", """).replace("\'", "&apos"), t["rating"] ] for t in meta_data[i]], key=lambda t: t[1], reverse=True)[:5] tooltip[genres[i]] = tmp tooltip_json = json.dumps(tooltip) # print(tooltip["Drama"]) pie = Pie() pie.add_js_funcs("data = JSON.parse(\'" + tooltip_json + "\');") pie.add( series_name="", data_pair=data_pair, tooltip_opts=opts.TooltipOpts( is_show=True, formatter=JsCode( "function(params){ text = \'\'; for (i = 0; i < 5; i++) { title = data[params.name][i][0]; rating = data[params.name][i][1]; text += title + \': \' + rating + '<br>'}; return text;}" ))) pie.set_global_opts(title_opts=opts.TitleOpts(title="IMDB Pie"), legend_opts=opts.LegendOpts(is_show=False)) pie.render("pie.html")
def kline(self): data = self.calculate().to_dict('list') kline = ( Kline().add_xaxis(xaxis_data=data["date"]).add_yaxis( series_name="portfolio index", y_axis=data["datas"], itemstyle_opts=opts.ItemStyleOpts( color="#ef232a", color0="#14b143", border_color="#ef232a", border_color0="#14b143", ), ).set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", is_scale=True, boundary_gap=False, axisline_opts=opts.AxisLineOpts(is_on_zero=False), splitline_opts=opts.SplitLineOpts(is_show=False), split_number=20, min_="dataMin", max_="dataMax", ), yaxis_opts=opts.AxisOpts( is_scale=True, splitline_opts=opts.SplitLineOpts(is_show=True)), datazoom_opts=[ opts.DataZoomOpts(is_show=False, type_="inside", xaxis_index=[0, 0], range_end=100), opts.DataZoomOpts(is_show=True, xaxis_index=[0, 1], pos_top="97%", range_end=100), opts.DataZoomOpts(is_show=False, xaxis_index=[0, 2], range_end=100), ], tooltip_opts=opts.TooltipOpts( trigger="axis", axis_pointer_type="cross", background_color="rgba(245, 245, 245, 0.8)", border_width=1, border_color="#ccc", textstyle_opts=opts.TextStyleOpts(color="#000"), ), brush_opts=opts.BrushOpts( x_axis_index="all", brush_link="all", out_of_brush={"colorAlpha": 0.1}, brush_type="lineX", ), # 三个图的 axis 连在一块 axispointer_opts=opts.AxisPointerOpts( is_show=True, link=[{ "xAxisIndex": "all" }], label=opts.LabelOpts(background_color="#777"), ), )) kline_line = (Line().add_xaxis(xaxis_data=data["date"]).add_yaxis( series_name="MA5", y_axis=self.calculate_ma(day_count=5, data=data), is_smooth=True, linestyle_opts=opts.LineStyleOpts(opacity=0.5), label_opts=opts.LabelOpts(is_show=False), ).add_yaxis( series_name="MA10", y_axis=self.calculate_ma(day_count=10, data=data), is_smooth=True, linestyle_opts=opts.LineStyleOpts(opacity=0.5), label_opts=opts.LabelOpts(is_show=False), ).add_yaxis( series_name="MA20", y_axis=self.calculate_ma(day_count=20, data=data), is_smooth=True, linestyle_opts=opts.LineStyleOpts(opacity=0.5), label_opts=opts.LabelOpts(is_show=False), ).add_yaxis( series_name="MA30", y_axis=self.calculate_ma(day_count=30, data=data), is_smooth=True, linestyle_opts=opts.LineStyleOpts(opacity=0.5), label_opts=opts.LabelOpts(is_show=False), ).set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", grid_index=1, axislabel_opts=opts.LabelOpts(is_show=False), ), yaxis_opts=opts.AxisOpts( grid_index=1, split_number=3, axisline_opts=opts.AxisLineOpts(is_on_zero=False), axistick_opts=opts.AxisTickOpts(is_show=False), splitline_opts=opts.SplitLineOpts(is_show=False), axislabel_opts=opts.LabelOpts(is_show=True), ), )) # Overlap Kline + Line overlap_kline_line = kline.overlap(kline_line) # Bar-1 bar_1 = (Bar().add_xaxis(xaxis_data=data["date"]).add_yaxis( series_name="Volumn", y_axis=data["volume"], xaxis_index=1, yaxis_index=1, label_opts=opts.LabelOpts(is_show=False), itemstyle_opts=opts.ItemStyleOpts(color=JsCode(""" function(params) { var colorList; if (barData[params.dataIndex][1] > barData[params.dataIndex][0]) { colorList = '#ef232a'; } else { colorList = '#14b143'; } return colorList; } """)), ).set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", grid_index=1, axislabel_opts=opts.LabelOpts(is_show=False), ), legend_opts=opts.LegendOpts(is_show=False), )) # Bar-2 (Overlap Bar + Line) bar_2 = (Bar().add_xaxis(xaxis_data=data["date"]).add_yaxis( series_name="MACD", y_axis=data["MACD"], xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), itemstyle_opts=opts.ItemStyleOpts(color=JsCode(""" function(params) { var colorList; if (params.data >= 0) { colorList = '#ef232a'; } else { colorList = '#14b143'; } return colorList; } """)), ).set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", grid_index=2, axislabel_opts=opts.LabelOpts(is_show=False), ), yaxis_opts=opts.AxisOpts( grid_index=2, split_number=4, axisline_opts=opts.AxisLineOpts(is_on_zero=False), axistick_opts=opts.AxisTickOpts(is_show=False), splitline_opts=opts.SplitLineOpts(is_show=False), axislabel_opts=opts.LabelOpts(is_show=True), ), legend_opts=opts.LegendOpts(is_show=False), )) line_2 = (Line().add_xaxis(xaxis_data=data["date"]).add_yaxis( series_name="DIFF", y_axis=data["DIFF"], xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), ).add_yaxis( series_name="DEA", y_axis=data["DEA"], xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), ).set_global_opts(legend_opts=opts.LegendOpts(is_show=False))) # 最下面的柱状图和折线图 overlap_bar_line = bar_2.overlap(line_2) # 最后的 Grid grid_chart = Grid( init_opts=opts.InitOpts(width="1500px", height="750px")) # 这个是为了把 data.datas 这个数据写入到 html 中,还没想到怎么跨 series 传值 # demo 中的代码也是用全局变量传的 grid_chart.add_js_funcs("var barData = {}".format(data["datas"])) # K线图和 MA5 的折线图 grid_chart.add( overlap_kline_line, grid_opts=opts.GridOpts(pos_left="3%", pos_right="1%", height="60%"), ) # Volumn 柱状图 grid_chart.add( bar_1, grid_opts=opts.GridOpts(pos_left="3%", pos_right="1%", pos_top="71%", height="10%"), ) # MACD DIFS DEAS grid_chart.add( overlap_bar_line, grid_opts=opts.GridOpts(pos_left="3%", pos_right="1%", pos_top="82%", height="14%"), ) makedir(self.path, 'kline') grid_chart.render( f"{self.path}\\kline\\{str(self.names)}_{time.strftime('%Y-%m-%d', time.localtime())}.html" )
), datazoom_opts=opts.DataZoomOpts( is_show=True, pos_bottom='2%', pos_top='94%' ) ) .add_xaxis(xaxis_data=x_data) .add_yaxis( series_name="本科院校", y_axis=y1_data, label_opts=opts.LabelOpts( is_show=False ), bar_width='25%', itemstyle_opts={ "normal": { "color": JsCode( """new echarts.graphic.LinearGradient(0, 0, 0, 1, [{ offset: 0, color: '#fccb05' }, { offset: 1, color: '#f5804d' }])""" ), "barBorderRadius": 11, } } ) ).render("university-top.html")
x_data = ["14", "15", "16", "17", "18", "19", "20", "21", "22", "23"] y_data = [393, 438, 485, 631, 689, 824, 987, 1000, 1100, 1200] background_color_js = ( "new echarts.graphic.LinearGradient(0, 0, 0, 1, " "[{offset: 0, color: '#c86589'}, {offset: 1, color: '#06a7ff'}], false)" ) area_color_js = ( "new echarts.graphic.LinearGradient(0, 0, 0, 1, " "[{offset: 0, color: '#eb64fb'}, {offset: 1, color: '#3fbbff0d'}], false)" ) c = ( Line(init_opts=opts.InitOpts(bg_color=JsCode(background_color_js))) .add_xaxis(xaxis_data=x_data) .add_yaxis( series_name="注册总量", y_axis=y_data, is_smooth=True, is_symbol_show=True, symbol="circle", symbol_size=6, linestyle_opts=opts.LineStyleOpts(color="#fff"), label_opts=opts.LabelOpts(is_show=True, position="top", color="white"), itemstyle_opts=opts.ItemStyleOpts( color="red", border_color="#fff", border_width=3 ), tooltip_opts=opts.TooltipOpts(is_show=False), areastyle_opts=opts.AreaStyleOpts(color=JsCode(area_color_js), opacity=1),
"value": 3, "percent": 3 / (12 + 3) }, { "value": 21, "percent": 21 / (23 + 21) }, { "value": 5, "percent": 5 / (33 + 5) }, { "value": 52, "percent": 52 / (3 + 52) }, { "value": 43, "percent": 43 / (33 + 43) }, ] c = (Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT)).add_xaxis([ 1, 2, 3, 4, 5 ]).add_yaxis("product1", list2, stack="stack1", category_gap="50%").add_yaxis( "product2", list3, stack="stack1", category_gap="50%" ).set_series_opts(label_opts=opts.LabelOpts( position="right", formatter=JsCode( "function(x){return Number(x.data.percent * 100).toFixed() + '%';}"), )).render("stack_bar_percent.html"))
def create_mixed_line_and_bar(type, title, x_list, data_list, data_unit1, data_unit2 = None): """ :param type: 1-折线用于表示变化率and单柱状图+单折线 2-折线用于表示变化率and多柱状图+多折线 3-折线表示占比and单柱状图+单折线 4-折线表示占比and多柱状图+多折线 5-折线用于描述另一维度指标(此时data_list中最后一个k-v为折线数据) :param title: 图表名称 :param x_list: 横坐标内容为时间序列,纵坐标高度为多个(同级)指标的总和,具体各个指标的数值、比例以不同颜色标出 :param data_list: 字典{key1:value1,key2:value2...},构成柱状图的多个不同类型的bar :param data_unit1: 第一根y轴的数值单位 :param data_unit2: 第二根y轴的数值单位 :return: """ c = Bar(init_opts=opts.InitOpts(height="600px",width="900px",theme=ThemeType.MACARONS)) c.add_xaxis(x_list) if type == 1: # 因为有overlap,所以需要自适应调整刻度范围,是的bar和line都能显示出来 all_rate_list = [] for key in data_list.keys(): # 单柱状图只有一个bar change_rate_list = [0] c.add_yaxis(key, data_list[key], bar_width="20%",label_opts=opts.LabelOpts(is_show=True)) for i in range(1,len(data_list[key])): if data_list[key][i-1] == 0 or data_list[key][i-1] is None or data_list[key][i] is None: # 注意分母不为0 change_rate_list.append(None) else: change_rate_list.append(round((data_list[key][i]-data_list[key][i-1])/data_list[key][i-1]*100,2)) all_rate_list.append(change_rate_list) c.extend_axis(yaxis=opts.AxisOpts( name="变化率", type_="value", min_=int(round((getMinRate(all_rate_list)-(getMaxRate(all_rate_list)-getMinRate(all_rate_list)))/10)*10), max_=int(round((getMaxRate(all_rate_list)/10)*10)), interval=10, axislabel_opts=opts.LabelOpts(formatter="{value} %"), )) line = ( Line() .add_xaxis(xaxis_data=x_list) .add_yaxis( series_name="增长率", yaxis_index=1, y_axis=all_rate_list[0], label_opts=opts.LabelOpts(is_show=True, formatter=JsCode( "function(x){console.log(x);return Number(x.data[1]).toFixed(2) + '%';}" )), ) ) c.set_global_opts(title_opts=opts.TitleOpts(title=title,# subtitle="数据来源国家统计局", # pos_left="center",pos_bottom="0px", # item_gap=2, # subtitle_textstyle_opts=opts.TextStyleOpts(color="black") ), legend_opts=opts.LegendOpts(pos_left="right"), yaxis_opts=opts.AxisOpts(name="单位:" + data_unit1, # name_location="end", # name_gap=5, # # name_rotate=45, min_=0, # 基本上指标数据都是为正的 max_=int(round(getMaxData(data_list)/10)*10)*2, interval=10, )) c.overlap(line) elif type == 2: count = len(data_list.keys()) all_rate_list = [] keys_list = [] for key in data_list.keys(): keys_list.append(key) change_rate_list = [0] c.add_yaxis(key, data_list[key], label_opts=opts.LabelOpts(is_show=True)) for i in range(1,len(data_list[key])): if data_list[key][i-1] == 0 or data_list[key][i-1] is None or data_list[key][i] is None: # 注意分母不为0 change_rate_list.append(None) else: change_rate_list.append(round((data_list[key][i]-data_list[key][i-1])/data_list[key][i-1]*100,2)) all_rate_list.append(change_rate_list) c.extend_axis(yaxis=opts.AxisOpts( name="变化率", type_="value", min_=int( round((getMinRate(all_rate_list) - (getMaxRate(all_rate_list) - getMinRate(all_rate_list))) / 10) * 10), max_=int(round((getMaxRate(all_rate_list) / 10) * 10)), interval=10, axislabel_opts=opts.LabelOpts(formatter="{value} %"), )) all_line = [] for i in range(count): line = ( Line() .add_xaxis(xaxis_data=x_list) .add_yaxis( series_name=keys_list[i] + "增长率", yaxis_index=1, y_axis=all_rate_list[i], label_opts=opts.LabelOpts(is_show=True, formatter=JsCode( "function(x){console.log(x);return Number(x.data[1]).toFixed(2) + '%';}" )), ) ) all_line.append(line) c.set_global_opts(title_opts=opts.TitleOpts(title=title, # subtitle="数据来源国家统计局", pos_left="center",pos_bottom="0px", # item_gap=2, # subtitle_textstyle_opts=opts.TextStyleOpts(color="black") ), legend_opts=opts.LegendOpts(pos_left="right"), yaxis_opts=opts.AxisOpts(name="单位:" + data_unit1, # name_location="end", # name_gap=5, # # name_rotate=45, min_=0, max_=int(round(getMaxData(data_list)/10)*10)*2, interval=10, )) for line in all_line: c.overlap(line) src_path = "./指标-年度-图片生成/" html_file_name = src_path + title + ".html" img_file_name = src_path + title + ".png" make_snapshot(snapshot, c.render(html_file_name), img_file_name) print(img_file_name+":生成完毕...")
def draw_chart(ts_code, start_date, end_date): ''' pyecharts V1 版本开始支持链式调用 文档地址 https://pyecharts.org/#/zh-cn/ ''' stock_data = get_process_datas(ts_code, start_date, end_date) stock_data.index = pd.to_datetime(stock_data['TIME'], format="%Y/%m/%d") x = stock_data["TIME"].values.tolist() stock_basic_data = stock_data[[ "TIME", "OPEN", "CLOSE", "LOW", "HIGH", "VOLUME" ]] # stock_data = stock_data.sort_index(ascending=True) # 倒序,看时间顺序是否正常决定是不是要用 # k线图 kline = ( Kline().add_xaxis(x).add_yaxis( "K线图", stock_basic_data.iloc[:, 1:5].values.tolist(), itemstyle_opts=opts.ItemStyleOpts(color="#ec0000", color0="#00da3c"), ).set_global_opts( xaxis_opts=opts.AxisOpts(is_scale=True, is_show=False), # axis_opts=opts.AxisOpts(is_scale=True,min_=0), #y轴起始坐标可以设为0 yaxis_opts=opts.AxisOpts( is_scale=True, splitarea_opts=opts.SplitAreaOpts( is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)), ), # y轴起始坐标可自动调整 tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="line"), legend_opts=opts.LegendOpts(is_show=True, orient='vertical', pos_right="5%", pos_top='20%'), title_opts=opts.TitleOpts(title="股票价格", subtitle=ts_code, pos_left='22%', pos_top="20%"), #把所有的x轴连接在一起 # axispointer_opts=opts.AxisPointerOpts(is_show=True, # link=[{"xAxisIndex": "all"}], # label=opts.LabelOpts(background_color="#777"), # ), datazoom_opts=[ # 设置zoom参数后即可缩放 opts.DataZoomOpts( is_show=True, type_="inside", xaxis_index=[0, 1, 2, 3, 4], # 设置第0轴和第1轴同时缩放 range_start=0, range_end=100, ), ], )) # 成交量柱形图 bar_volumn = (Bar().add_xaxis(x).add_yaxis( "成交量", stock_basic_data["VOLUME"].values.tolist(), xaxis_index=1, yaxis_index=1, label_opts=opts.LabelOpts(is_show=False), itemstyle_opts=opts.ItemStyleOpts(color=JsCode(""" function(params) { var colorList; if (barData[params.dataIndex][1] > barData[params.dataIndex][0]) { colorList = '#ef232a'; } else { colorList = '#14b143'; } return colorList; } """)), ).set_global_opts( title_opts=opts.TitleOpts(title="成交量", pos_left='22%', pos_top="48%"), legend_opts=opts.LegendOpts(is_show=True, orient='vertical', pos_right="5%", pos_top='48%'), )) #绘制均线图 line_ma = ( Line().add_xaxis(x).add_yaxis( series_name="MA5", y_axis=stock_data["MA5"].values.tolist(), is_hover_animation=False, # linestyle_opts=opts.LineStyleOpts(width=3, opacity=0.5), label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, ).add_yaxis( series_name="MA10", y_axis=stock_data["MA10"].values.tolist(), is_hover_animation=False, label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, ).add_yaxis( series_name="MA20", y_axis=stock_data["MA20"].values.tolist(), is_hover_animation=False, label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, ).set_global_opts( title_opts=opts.TitleOpts(title="MA", pos_left='22%', pos_top="88%"), xaxis_opts=opts.AxisOpts( type_="category", axislabel_opts=opts.LabelOpts(is_show=False), is_scale=True), datazoom_opts=[opts.DataZoomOpts(type_="inside")], legend_opts=opts.LegendOpts(is_show=True, orient='vertical', pos_right="5%", pos_top='85%'), yaxis_opts=opts.AxisOpts( is_scale=True, splitarea_opts=opts.SplitAreaOpts( is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)), ), )) #绘制jdk线 line_kdj = (Line().add_xaxis(x).add_yaxis( series_name="K", y_axis=stock_data["K"].values.tolist(), linestyle_opts=opts.LineStyleOpts(opacity=0.5), label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, ).add_yaxis( series_name="D", y_axis=stock_data["D"].values.tolist(), linestyle_opts=opts.LineStyleOpts(opacity=0.5), label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, ).add_yaxis( series_name="J", y_axis=stock_data["J"].values.tolist(), label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, ).set_global_opts( title_opts=opts.TitleOpts(title="KDJ", pos_left='22%', pos_top="62%"), datazoom_opts=[opts.DataZoomOpts(type_="inside", )], legend_opts=opts.LegendOpts(is_show=True, orient='vertical', pos_right="7%", pos_top='60%'), xaxis_opts=opts.AxisOpts( is_scale=True, axislabel_opts=opts.LabelOpts(is_show=False), ), yaxis_opts=opts.AxisOpts( is_scale=True, splitarea_opts=opts.SplitAreaOpts( is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)), ), )) #绘制macd柱状图 bar_macd = (Bar().add_xaxis(x).add_yaxis( series_name='MACD', yaxis_data=stock_data['MACD'].values.tolist(), xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), itemstyle_opts=opts.ItemStyleOpts(color=JsCode(""" function(params) { var colorList; if (params.data >= 0) { colorList = '#ef232a'; } else { colorList = '#14b143'; } return colorList; } """)), ).set_global_opts( title_opts=opts.TitleOpts(title="MACD", pos_left='22%', pos_top="75%"), xaxis_opts=opts.AxisOpts( type_="category", grid_index=2, axislabel_opts=opts.LabelOpts(is_show=False), ), yaxis_opts=opts.AxisOpts( grid_index=2, split_number=4, axisline_opts=opts.AxisLineOpts(is_on_zero=False), axistick_opts=opts.AxisTickOpts(is_show=False), splitline_opts=opts.SplitLineOpts(is_show=False), axislabel_opts=opts.LabelOpts(is_show=True), ), legend_opts=opts.LegendOpts(is_show=True, orient='vertical', pos_right="5%", pos_top='70%'), )) #绘制DIF和DEA line_macd = (Line().add_xaxis(x).add_yaxis( series_name="DIF", y_axis=stock_data['DIF'].values.tolist(), xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, ).add_yaxis( series_name="DEA", y_axis=stock_data['DEA'].values.tolist(), xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, ).set_global_opts(legend_opts=opts.LegendOpts(is_show=False))) #绘制布林线 line_boll = (Line().add_xaxis(x).add_yaxis( series_name="MID", y_axis=stock_data["MID"].values.tolist(), linestyle_opts=opts.LineStyleOpts(opacity=0.5), label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, ).add_yaxis( series_name="UPPER", y_axis=stock_data["UPPER"].values.tolist(), linestyle_opts=opts.LineStyleOpts(opacity=0.5), label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, ).add_yaxis( series_name="LOWER", y_axis=stock_data["LOWER"].values.tolist(), linestyle_opts=opts.LineStyleOpts(opacity=0.5), label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, ).set_global_opts( datazoom_opts=[opts.DataZoomOpts(type_="inside", )], xaxis_opts=opts.AxisOpts(is_scale=True), yaxis_opts=opts.AxisOpts( is_scale=True, splitarea_opts=opts.SplitAreaOpts( is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)), ), )) overlap_kline_linema = kline.overlap(line_boll) overlap_macd = bar_macd.overlap(line_macd) # 使用网格将多张图标组合到一起显示 grid_chart = Grid(init_opts=opts.InitOpts( width="1400px", height="700px", animation_opts=opts.AnimationOpts(animation=False), )) # 为了把 data.datas 的数据写入到html中作为全局变量,目前无法跨 series 传值 # demo 中的代码也是用全局变量传的 grid_chart.add_js_funcs("var barData = {}".format( stock_basic_data.iloc[:, 1:5].values.tolist())) grid_chart.add( overlap_kline_linema, grid_opts=opts.GridOpts(pos_left="35%", pos_right="15%", pos_top="3%", height="40%"), ) grid_chart.add( bar_volumn, grid_opts=opts.GridOpts(pos_left="35%", pos_right="15%", pos_top="45%", height="10%"), ) grid_chart.add(line_kdj, grid_opts=opts.GridOpts(pos_left="35%", pos_right="15%", pos_top="60%", height="10%")) grid_chart.add(overlap_macd, grid_opts=opts.GridOpts(pos_left="35%", pos_right="15%", pos_top="72%", height="10%")) grid_chart.add(line_ma, grid_opts=opts.GridOpts(pos_left="35%", pos_right="15%", pos_top="85%", height="10%")) grid_chart.render('stock_{}/stock_{}.html'.format( ts_code, ts_code)) # 保存成用股票代码命名的文档 return 0
def plot_kline(ka, bs=None, file_html="kline.html", width="1400px", height="680px"): """ :param ka: KlineAnalyze :param bs: pd.DataFrame 买卖点,包含三个字段 ["操作提示", "交易时间", "交易价格"] :param file_html: str :param width: str :param height: str :return: None """ df = pd.DataFrame(ka.kline) df = macd(df) x = df.dt.to_list() title = "%s | %s 至 %s" % (ka.symbol, ka.start_dt, ka.end_dt) kline = ( Kline() .add_xaxis(xaxis_data=x) .add_yaxis( series_name="", y_axis=df[['open', 'close', 'low', 'high']].values.tolist(), itemstyle_opts=opts.ItemStyleOpts( color="#ef232a", color0="#14b143", border_color="#ef232a", border_color0="#14b143", ), ) .set_series_opts( markarea_opts=opts.MarkAreaOpts(is_silent=True) ) .set_global_opts( title_opts=opts.TitleOpts(title=title, pos_left="0"), xaxis_opts=opts.AxisOpts( type_="category", is_scale=True, boundary_gap=False, axisline_opts=opts.AxisLineOpts(is_on_zero=False), splitline_opts=opts.SplitLineOpts(is_show=False), split_number=20, min_="dataMin", max_="dataMax", ), yaxis_opts=opts.AxisOpts( is_scale=True, splitline_opts=opts.SplitLineOpts(is_show=True), axislabel_opts=opts.LabelOpts(is_show=True, position="inside") ), tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="line"), datazoom_opts=[ opts.DataZoomOpts( is_show=False, type_="inside", xaxis_index=[0, 0], range_end=100 ), opts.DataZoomOpts( is_show=True, xaxis_index=[0, 1], pos_top="96%", range_end=100 ), opts.DataZoomOpts(is_show=False, xaxis_index=[0, 2], range_end=100), ], # 三个图的 axis 连在一块 axispointer_opts=opts.AxisPointerOpts( is_show=True, link=[{"xAxisIndex": "all"}], label=opts.LabelOpts(background_color="#777"), ), ) ) kline_line = ( Line() .add_xaxis(xaxis_data=x) .add_yaxis( series_name="笔", y_axis=df.bi.tolist(), is_smooth=False, is_connect_nones=True, symbol='diamond', symbol_size=8, linestyle_opts=opts.LineStyleOpts(opacity=1, type_='dotted', width=2), label_opts=opts.LabelOpts(is_show=False), ) .add_yaxis( series_name="线段", y_axis=df.xd.tolist(), is_smooth=False, is_connect_nones=True, symbol='triangle', symbol_size=12, linestyle_opts=opts.LineStyleOpts(opacity=1, type_='solid', width=2), label_opts=opts.LabelOpts(is_show=True, position='right'), ) .set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", grid_index=1, axislabel_opts=opts.LabelOpts(is_show=False), ), yaxis_opts=opts.AxisOpts( grid_index=1, split_number=3, axisline_opts=opts.AxisLineOpts(is_on_zero=False), axistick_opts=opts.AxisTickOpts(is_show=False), splitline_opts=opts.SplitLineOpts(is_show=False), axislabel_opts=opts.LabelOpts(is_show=True, position="inside"), ), ) ) # Overlap Kline + Line overlap_kline_line = kline.overlap(kline_line) if isinstance(bs, pd.DataFrame) and len(bs) > 0: c = ( Scatter() .add_xaxis(bs['交易时间'].to_list()) .add_yaxis( "买卖点", bs['交易价格'].to_list(), label_opts=opts.LabelOpts( is_show=True, position="left", formatter=JsCode( "function(params){return bsName[params.dataIndex][0];}" ) ), )) overlap_kline_line = overlap_kline_line.overlap(c) # draw volume bar_1 = ( Bar() .add_xaxis(xaxis_data=x) .add_yaxis( series_name="Volumn", yaxis_data=df.vol.tolist(), xaxis_index=1, yaxis_index=1, label_opts=opts.LabelOpts(is_show=False), itemstyle_opts=opts.ItemStyleOpts( color=JsCode( """ function(params) { var colorList; if (barData[params.dataIndex][1] > barData[params.dataIndex][0]) { colorList = '#ef232a'; } else { colorList = '#14b143'; } return colorList; } """ ) ), ) .set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", grid_index=1, axislabel_opts=opts.LabelOpts(is_show=False), ), yaxis_opts=opts.AxisOpts( axislabel_opts=opts.LabelOpts(is_show=True, position='inside') ), legend_opts=opts.LegendOpts(is_show=False), ) ) # Bar-2 (Overlap Bar + Line) bar_2 = ( Bar() .add_xaxis(xaxis_data=x) .add_yaxis( series_name="MACD", yaxis_data=df.macd.tolist(), xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), itemstyle_opts=opts.ItemStyleOpts( color=JsCode( """ function(params) { var colorList; if (params.data >= 0) { colorList = '#ef232a'; } else { colorList = '#14b143'; } return colorList; } """ ) ), ) .set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", grid_index=2, axislabel_opts=opts.LabelOpts(is_show=False), ), yaxis_opts=opts.AxisOpts( grid_index=2, split_number=4, axisline_opts=opts.AxisLineOpts(is_on_zero=False), axistick_opts=opts.AxisTickOpts(is_show=False), splitline_opts=opts.SplitLineOpts(is_show=False), axislabel_opts=opts.LabelOpts(is_show=True, position="inside"), ), legend_opts=opts.LegendOpts(is_show=False), ) ) line_2 = ( Line() .add_xaxis(xaxis_data=x) .add_yaxis( series_name="DIF", y_axis=df['diff'].tolist(), xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), ) .add_yaxis( series_name="DEA", y_axis=df['dea'].tolist(), xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), ) .set_global_opts(legend_opts=opts.LegendOpts(is_show=False)) ) # draw MACD overlap_bar_line = bar_2.overlap(line_2) # 最后的 Grid grid_chart = Grid(init_opts=opts.InitOpts(width=width, height=height, page_title=title)) grid_chart.add_js_funcs("var barData = {}".format(df[['open', 'close', 'low', 'high']].values.tolist())) if isinstance(bs, pd.DataFrame) and len(bs) > 0: grid_chart.add_js_funcs("var bsName = {}".format(bs[["操作提示", "交易价格"]].values.tolist())) grid_chart.add( overlap_kline_line, grid_opts=opts.GridOpts(pos_left="3%", pos_right="1%", height="60%"), ) grid_chart.add( bar_1, grid_opts=opts.GridOpts(pos_left="3%", pos_right="1%", pos_top="71%", height="10%"), ) grid_chart.add( overlap_bar_line, grid_opts=opts.GridOpts(pos_left="3%", pos_right="1%", pos_top="82%", height="14%"), ) grid_chart.render(path=file_html)
"2015-7", "2015-8", "2015-9", "2015-10", "2015-11", "2015-12", ], xaxis=opts.AxisOpts( type_="category", axistick_opts=opts.AxisTickOpts(is_align_with_label=True), axisline_opts=opts.AxisLineOpts( is_on_zero=False, linestyle_opts=opts.LineStyleOpts(color="#6e9ef1")), axispointer_opts=opts.AxisPointerOpts( is_show=True, label=opts.LabelOpts(formatter=JsCode(js_formatter))), ), ).add_yaxis( series_name="2015 降水量", is_smooth=True, symbol="emptyCircle", is_symbol_show=False, # xaxis_index=1, color="#d14a61", y_axis=[ 2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3 ], label_opts=opts.LabelOpts(is_show=False), linestyle_opts=opts.LineStyleOpts(width=2), ).add_yaxis( series_name="2016 降水量",
"globalCoord": False }) ).set_global_opts(title_opts=opts.TitleOpts( title="拜登和川普最新支持率", title_link="https://new.qq.com/omn/20201004/20201004A0098Z00.html", pos_left="32%", pos_top="15%", title_textstyle_opts=opts.TextStyleOpts( color="white", font_size=30, )))) return l1 l1 = buildLiquid("拜登", [0.65], ["30%", "50%"]) l2 = buildLiquid("川普", [0.35], ["70%", "50%"]) grid = (Grid(init_opts=opts.InitOpts(bg_color=JsCode(""" new echarts.graphic.RadialGradient(0.3, 0.3, 0.8, [{ offset: 0, color: '#431ab8' }, { offset: 1, color: '#471bba' }]) """))).add(l1, grid_opts=opts.GridOpts()).add( l2, grid_opts=opts.GridOpts())) grid.render("multiple_liquid.html")
# 多个水球图显示 l1 = (Liquid().add("lq", [0.6, 0.7], center=["60%", "50%"], shape="diamond").set_global_opts(title_opts=opts.TitleOpts( title="多个Liquid显示"))) # JsCode里面的%只能是单引号,双引号不会报错,但是结果也不会显示 # Math.floor() 向下取整 l2 = Liquid().add( "lq", [0.3254], center=["25%", "50%"], shape="diamond", label_opts=opts.LabelOpts( font_size=50, formatter=JsCode("""function (param){ return (Math.floor(param.value * 10000)/100) + '%'; }"""), position="inside", ), ) grid = Grid().add(l1, grid_opts=opts.GridOpts()).add(l2, grid_opts=opts.GridOpts()) grid.render("multiple_liquid.html") # Section2 平行坐标系 from pyecharts.charts import Parallel data = [ [1, 91, 45, 125, 0.82, 34, 23, "良"], [2, 65, 27, 78, 0.86, 45, 29, "良"],
def anylize_to_html_02(data={}, fl_style='para1', info='', add_info=''): # 根据生成的原始数据 from pyecharts import options as opts from pyecharts.commons.utils import JsCode from pyecharts.charts import Scatter, Bar, Timeline, Line, Page, Tab from pyecharts.components import Table tab0 = Tab() data.loc[(data['max_back_1'] != 0), '赢撤比'] = -1 * data['end_1'] / data['max_back_1'] data.loc[(data['max_back_1'] == 0), '赢撤比'] = 0 data = data[data['end_1'] != 0] clm = list(set(data['celue_name'].tolist())) print(clm) title = f'所有参数的,每个指标的统计状态:' tjdf = pd.DataFrame() tj_dict = {} # 生成分类数据tjdf i = 0 tj_index = { 'end_1': '最终收益', 'sharp_rate_1': '夏普率', 'max_back_1': '最大回撤', 'win_rate_2': '胜率', 'trade_nums_1': '交易次数', 'profit_days_1': '盈利天数', '赢撤比': '赢撤比' } for clm0 in clm: print(clm0) df = data[data['celue_name'] == clm0].copy() for k, v in df.groupby(fl_style): print(k) index_0 = i + 1 i = i + 1 tjdf.loc[index_0, fl_style] = k tjdf.loc[index_0, 'clm'] = clm0 for tj_ix in tj_index.keys(): tjdf.loc[index_0, tj_index[tj_ix]] = v[tj_ix].mean() tjdf.loc[index_0, '赢撤比2'] = -1 * v['end_1'].mean( ) / v['max_back_1'].mean() if v['max_back_1'].mean() != 0 else 0 print(tjdf) print(tjdf.keys()) # exit() filter_col = '夏普率' df0_dict = {} #策略名+参数的字典。 tjdf2 = pd.DataFrame() for x, clm0 in enumerate(clm): # 每个策略类,按照filter_col排序,根据每个策略回测数量,选取比较高的排名的策略 df0 = tjdf[tjdf['clm'] == clm0].copy() df0.sort_values(filter_col, ascending=True, inplace=True) df0 = df0.iloc[-1 * int(df0.shape[0] * 0.35):] df0_dict[str(df0.iloc[-1]['clm'])] = list( sorted(set(df0[fl_style].tolist()))) tjdf2 = tjdf2.append(df0, ignore_index=True) tjdf2.sort_values('最终收益', ascending=True, inplace=True) tjdf2 = tjdf2.iloc[int(tjdf2.shape[0] * 0.1):] print(tjdf2) tj_index2 = list(tjdf2.keys()) tj_index2.remove(fl_style) tj_index2.remove('clm') clm2 = tj_index2 for x, clm0 in enumerate(clm2): tl = Timeline() tjdf0 = tjdf2[tjdf2['最终收益'] != 0].copy() tjdf0.sort_values(clm0, ascending=True, inplace=True) # df0 = tjdf0.iloc[-1*int(tjdf0.shape[0]*0.12):].copy() df0 = tjdf0 index_list = list(df0.keys()) index_list.remove('clm') df0 = df0[index_list] for k, i in enumerate(index_list): xdata, ydata1 = df0[fl_style], df0[[i, fl_style]] print(add_info) # print( ydata1) sca0 = (Scatter().add_js_funcs( f"document.write('%s')" % add_info ).add_xaxis(xdata.tolist()).add_yaxis( '分布值', ydata1.values.tolist(), label_opts=opts.LabelOpts(is_show=False, ), ).set_global_opts( xaxis_opts=opts.AxisOpts( offset=0, name='参数名:', type_="value", is_show=True, axistick_opts=opts.AxisTickOpts(is_show=True)), yaxis_opts=opts.AxisOpts( offset=0, name='分布值:', type_="value", axistick_opts=opts.AxisTickOpts(is_show=True)), title_opts=opts.TitleOpts(title=f"{title}==:{i}"), legend_opts=opts.LegendOpts(pos_right=True), tooltip_opts=opts.TooltipOpts(formatter=JsCode( "function (params) { return '==canshu:'+params.value[0] +' <br/>== 指标:'+ params.value[1]}" ), ), )) tl.add(sca0, f"{i}") tab0.add(tl, clm0) tl.render(f"{info}.html") print(f"{info}.html") return df0_dict
RADAR: str = "radar" SANKEY: str = "sankey" SCATTER: str = "scatter" SCATTER3D: str = "scatter3D" SUNBURST: str = "sunburst" THEMERIVER: str = "themeRiver" TREE: str = "tree" TREEMAP: str = "treemap" WORDCLOUD: str = "wordCloud" CUSTOM: str = "custom" ToolTipFormatterType = { _ChartType.GEO: JsCode("""function (params) { return params.name + ' : ' + params.value[2]; }"""), _ChartType.GAUGE: "{a} <br/>{b} : {c}%", } class _ThemeType: BUILTIN_THEMES = ["light", "dark", "white"] LIGHT = "light" DARK = "dark" WHITE = "white" CHALK: str = "chalk" ESSOS: str = "essos" INFOGRAPHIC: str = "infographic" MACARONS: str = "macarons"
("海南", [110.3893, 19.8516, 300]), ("上海", [121.4648, 31.2891, 1300]), ] c = ( Map3D() .add_schema( itemstyle_opts=opts.ItemStyleOpts( color="rgb(5,101,123)", opacity=1, border_width=0.8, border_color="rgb(62,215,213)", ), map3d_label=opts.Map3DLabelOpts( is_show=False, formatter=JsCode("function(data){return data.name + " " + data.value[2];}"), ), emphasis_label_opts=opts.LabelOpts( is_show=False, color="#fff", font_size=10, background_color="rgba(0,23,11,0)", ), light_opts=opts.Map3DLightOpts( main_color="#fff", main_intensity=1.2, main_shadow_quality="high", is_main_shadow=False, main_beta=10, ambient_intensity=0.3, ),
197.20820681141507, ], ], "outliers": [], }, ] (Boxplot(init_opts=opts.InitOpts(width="1600px", height="800px")).add_xaxis( xaxis_data=axis_data).add_yaxis( series_name="category0", y_axis=data[0]["boxData"], tooltip_opts=opts.TooltipOpts( formatter=JsCode("""function(param) { return [ 'Experiment ' + param.name + ': ', 'upper: ' + param.data[0], 'Q1: ' + param.data[1], 'median: ' + param.data[2], 'Q3: ' + param.data[3], 'lower: ' + param.data[4] ].join('<br/>') }""")), ).add_yaxis( series_name="category1", y_axis=data[1]["boxData"], tooltip_opts=opts.TooltipOpts( formatter=JsCode("""function(param) { return [ 'Experiment ' + param.name + ': ', 'upper: ' + param.data[0], 'Q1: ' + param.data[1], 'median: ' + param.data[2], 'Q3: ' + param.data[3], 'lower: ' + param.data[4] ].join('<br/>') }""")),
def line_color_with_js_func() -> Line: x_data = ["14", "15", "16", "17", "18", "19", "20", "21", "22", "23"] y_data = [393, 438, 485, 631, 689, 824, 987, 1000, 1100, 1200] background_color_js = ( "new echarts.graphic.LinearGradient(0, 0, 0, 1, " "[{offset: 0, color: '#c86589'}, {offset: 1, color: '#06a7ff'}], false)" ) area_color_js = ( "new echarts.graphic.LinearGradient(0, 0, 0, 1, " "[{offset: 0, color: '#eb64fb'}, {offset: 1, color: '#3fbbff0d'}], false)" ) c = (Line(init_opts=opts.InitOpts(bg_color=JsCode( background_color_js))).add_xaxis(xaxis_data=x_data).add_yaxis( series_name="注册总量", y_axis=y_data, is_smooth=True, is_symbol_show=True, symbol="circle", symbol_size=6, linestyle_opts=opts.LineStyleOpts(color="#fff"), label_opts=opts.LabelOpts(is_show=True, position="top", color="white"), itemstyle_opts=opts.ItemStyleOpts(color="red", border_color="#fff", border_width=3), tooltip_opts=opts.TooltipOpts(is_show=False), areastyle_opts=opts.AreaStyleOpts(color=JsCode(area_color_js), opacity=1), ).set_global_opts( title_opts=opts.TitleOpts( title="OCTOBER 2015", pos_bottom="5%", pos_left="center", title_textstyle_opts=opts.TextStyleOpts(color="#fff", font_size=16), ), xaxis_opts=opts.AxisOpts( type_="category", boundary_gap=False, axislabel_opts=opts.LabelOpts(margin=30, color="#ffffff63"), axisline_opts=opts.AxisLineOpts(is_show=False), axistick_opts=opts.AxisTickOpts( is_show=True, length=25, linestyle_opts=opts.LineStyleOpts(color="#ffffff1f"), ), splitline_opts=opts.SplitLineOpts( is_show=True, linestyle_opts=opts.LineStyleOpts(color="#ffffff1f")), ), yaxis_opts=opts.AxisOpts( type_="value", position="right", axislabel_opts=opts.LabelOpts(margin=20, color="#ffffff63"), axisline_opts=opts.AxisLineOpts( linestyle_opts=opts.LineStyleOpts(width=2, color="#fff")), axistick_opts=opts.AxisTickOpts( is_show=True, length=15, linestyle_opts=opts.LineStyleOpts(color="#ffffff1f"), ), splitline_opts=opts.SplitLineOpts( is_show=True, linestyle_opts=opts.LineStyleOpts(color="#ffffff1f")), ), legend_opts=opts.LegendOpts(is_show=False), )) return c
def new_label_opts(): return opts.LabelOpts(formatter=JsCode(fn), position="center")
def plot_kline(df, rendered=True, ucolor="#ef232a", dcolor="#14b143", col=""): """ 针对 dataframe 直接画出标准看盘软件的上k线图下成交量图的形式 :param df: :param rendered: :param ucolor: str for color when going up, default red in A stock as "#ef232a" :param dcolor: str for color when going down, default green in A stock as "#14b143" :param col: :return: """ # TODO: color changing seems to make no effect, possible issue with pyecharts kline = ( Kline().add_xaxis(xaxis_data=list(df["date"])).add_yaxis( series_name="", itemstyle_opts=opts.ItemStyleOpts( color=ucolor, color0=dcolor, border_color=ucolor, border_color0=dcolor, ), y_axis=list(zip(df["open"], df["close"], df["low"], df["high"])), markpoint_opts=opts.MarkPointOpts( data=[ opts.MarkPointItem(type_="max", name="最大值"), opts.MarkPointItem(type_="min", name="最小值"), ], symbol="pin", symbol_size=[56, 40], # label_opts=opts.LabelOpts(color="#CCFFFF",position=["top", "bottom"]) ), ).set_global_opts( datazoom_opts=[ opts.DataZoomOpts( is_show=True, type_="slider", range_start=50, range_end=100, xaxis_index=[0, 1], ), opts.DataZoomOpts( is_show=False, type_="inside", range_start=50, range_end=100, xaxis_index=1, ), ], tooltip_opts=opts.TooltipOpts( is_show=True, trigger="axis", trigger_on="mousemove", axis_pointer_type="cross", ), )) if col: line = (Line().add_xaxis(xaxis_data=list(df["date"])).add_yaxis( series_name="", y_axis=list(df[col]), is_smooth=True, linestyle_opts=opts.LineStyleOpts(opacity=0.5), label_opts=opts.LabelOpts(is_show=False), )) kline = kline.overlap(line) if "volume" in df.columns: vl = list(df["volume"]) elif "amount" in df.columns: vl = list(df["amount"]) else: vl = [0 for _ in range(len(df))] bar = ( Bar().add_js_funcs("var barData = {}".format( list(df["close"] - df["open"]))).add_xaxis( xaxis_data=list(df["date"])).add_yaxis( series_name="", yaxis_data=vl, label_opts=opts.LabelOpts(is_show=False), itemstyle_opts=opts.ItemStyleOpts( color=JsCode(""" function(params) {{ var colorList; if (barData[params.dataIndex]>0) {{ colorList = '{ucolor}'; }} else {{ colorList = '{dcolor}'; }} return colorList; }} """.format(ucolor=ucolor, dcolor=dcolor)) # escape {} when using format ), ).set_global_opts(tooltip_opts=opts.TooltipOpts( is_show=True, trigger="axis", trigger_on="mousemove", axis_pointer_type="cross", ), )) grid_chart = Grid() grid_chart.add_js_funcs("var barData = {}".format( list(df["close"] - df["open"]))) grid_chart.add( kline, grid_opts=opts.GridOpts(pos_left="10%", pos_right="1%", pos_top="2%", height="65%"), ) grid_chart.add( bar, grid_opts=opts.GridOpts(pos_left="10%", pos_right="1%", pos_top="71%", height="22%"), ) if rendered: return grid_chart.render_notebook() else: return grid_chart
def draw_charts(echarts_data): kline_data = echarts_data["data"] date = echarts_data["date"] kline = ( Kline().add_xaxis(xaxis_data=date).add_yaxis( series_name="Dow-Jones index", y_axis=kline_data, itemstyle_opts=opts.ItemStyleOpts(color="#ec0000", color0="#00da3c"), ).set_global_opts( legend_opts=opts.LegendOpts(is_show=False, pos_bottom=10, pos_left="center"), # 其中inside是支持鼠标缩放 datazoom_opts=[ opts.DataZoomOpts( is_show=True, type_="inside", xaxis_index=[0, 1, 2, 3, 4], range_start=50, range_end=100, ), opts.DataZoomOpts( is_show=True, xaxis_index=[0, 1, 2, 3, 4], type_="slider", range_start=50, range_end=100, ), ], # # 不知道为什么要分开三个写,可能是想通过xaxis_index分别配置 # datazoom_opts=[ # opts.DataZoomOpts( # is_show=False, type_="inside", xaxis_index=[0, 0], range_end=100 # ), # opts.DataZoomOpts( # is_show=True, xaxis_index=[0, 1], pos_top="97%", range_end=100 # ), # opts.DataZoomOpts(is_show=False, xaxis_index=[0, 2], range_end=100), # ], yaxis_opts=opts.AxisOpts( is_scale=True, splitarea_opts=opts.SplitAreaOpts( is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1)), ), title_opts=opts.TitleOpts(title="my_echart"), tooltip_opts=opts.TooltipOpts( trigger="axis", axis_pointer_type="cross", background_color="rgba(245, 245, 245, 0.8)", border_width=1, border_color="#ccc", textstyle_opts=opts.TextStyleOpts(color="#000"), ), visualmap_opts=opts.VisualMapOpts( is_show=False, dimension=2, series_index=5, is_piecewise=True, pieces=[ { "value": 1, "color": "#00da3c" }, { "value": -1, "color": "#ec0000" }, ], ), # 所有图的axis 连在一块 axispointer_opts=opts.AxisPointerOpts( is_show=True, link=[{ "xAxisIndex": "all" }], label=opts.LabelOpts(background_color="#777"), ), brush_opts=opts.BrushOpts( x_axis_index="all", brush_link="all", out_of_brush={"colorAlpha": 0.1}, brush_type="lineX", ), )) line = ( Line().add_xaxis(xaxis_data=date).add_yaxis( series_name="MA5", y_axis=echarts_data['ma5'], is_smooth=True, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=3, opacity=0.5), label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, # 去掉折线上的小圆点 ).add_yaxis( series_name="MA20", y_axis=echarts_data['ma20'], is_smooth=True, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=3, opacity=0.5), label_opts=opts.LabelOpts(is_show=False), is_symbol_show=False, # 去掉折线上的小圆点 ).set_global_opts(xaxis_opts=opts.AxisOpts(type_="category"))) # Kline And Line overlap_kline_line = kline.overlap(line) bar = ( Bar().add_xaxis(xaxis_data=date).add_yaxis( series_name="Volume", y_axis=echarts_data['volume'], xaxis_index=1, yaxis_index=1, label_opts=opts.LabelOpts(is_show=False), # # # 变色 itemstyle_opts=opts.ItemStyleOpts(color=JsCode(""" function(params) { var colorList; if (barData[params.dataIndex][1] > barData[params.dataIndex][0]) { colorList = '#ef232a'; } else { colorList = '#14b143'; } return colorList; } """)), ).set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", is_scale=True, grid_index=1, boundary_gap=False, axisline_opts=opts.AxisLineOpts(is_on_zero=False), axistick_opts=opts.AxisTickOpts(is_show=False), splitline_opts=opts.SplitLineOpts(is_show=False), axislabel_opts=opts.LabelOpts(is_show=False), split_number=20, min_="dataMin", max_="dataMax", ), yaxis_opts=opts.AxisOpts( grid_index=1, is_scale=True, split_number=2, axislabel_opts=opts.LabelOpts(is_show=False), axisline_opts=opts.AxisLineOpts(is_show=False), axistick_opts=opts.AxisTickOpts(is_show=False), splitline_opts=opts.SplitLineOpts(is_show=False), ), legend_opts=opts.LegendOpts(is_show=False), )) # Bar-2 (Overlap Bar + Line) bar_2 = ( Bar().add_xaxis(xaxis_data=date).add_yaxis( series_name="MACD", y_axis=echarts_data['macd'], xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), itemstyle_opts=opts.ItemStyleOpts(color=JsCode(""" function(params) { var colorList; if (params.data >= 0) { colorList = '#ef232a'; } else { colorList = '#14b143'; } return colorList; } """)), ).set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", grid_index=2, axislabel_opts=opts.LabelOpts(is_show=False), # axisline_opts=opts.AxisLineOpts(is_on_zero=False), axistick_opts=opts.AxisTickOpts(is_show=False), # 不显示刻度 # splitline_opts=opts.SplitLineOpts(is_show=False), # 不显示刻度 # axislabel_opts=opts.LabelOpts(is_show=False), # split_number=20, ), yaxis_opts=opts.AxisOpts( grid_index=2, split_number=4, axisline_opts=opts.AxisLineOpts(is_on_zero=False), axistick_opts=opts.AxisTickOpts(is_show=False), splitline_opts=opts.SplitLineOpts(is_show=False), axislabel_opts=opts.LabelOpts(is_show=True), ), legend_opts=opts.LegendOpts(is_show=False), )) macd_line = ( Line().add_xaxis(xaxis_data=date).add_yaxis( series_name="DIFF", y_axis=echarts_data['macd_diff'], # xaxis_index=2, # yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), ).add_yaxis( series_name="DEA", y_axis=echarts_data["macd_dea"], # xaxis_index=2, # yaxis_index=2, is_symbol_show=False, # 去掉折线上的小圆点 label_opts=opts.LabelOpts(is_show=False), ) # .set_global_opts(legend_opts=opts.LegendOpts(is_show=False)) # .set_global_opts(xaxis_opts=opts.AxisOpts(type_="category")) ) # MACD BAR And MACD Line bar_macd_line = bar_2.overlap(macd_line) # KDJ kdj_line = ( Line().add_xaxis(xaxis_data=date).add_yaxis( series_name="K", y_axis=echarts_data['kdj_k'], is_symbol_show=False, # 去掉折线上的小圆点 label_opts=opts.LabelOpts(is_show=False), ).add_yaxis( series_name="D", y_axis=echarts_data["kdj_d"], is_symbol_show=False, # 去掉折线上的小圆点 label_opts=opts.LabelOpts(is_show=False), ).add_yaxis( series_name="J", y_axis=echarts_data["kdj_j"], is_symbol_show=False, # 去掉折线上的小圆点 label_opts=opts.LabelOpts(is_show=False), # markline_opts=opts.MarkLineOpts( # data=[100] # ), ).set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", grid_index=2, axislabel_opts=opts.LabelOpts(is_show=False), # axisline_opts=opts.AxisLineOpts(is_on_zero=False), axistick_opts=opts.AxisTickOpts(is_show=False), # 不显示刻度 # splitline_opts=opts.SplitLineOpts(is_show=False), # 不显示刻度 # axislabel_opts=opts.LabelOpts(is_show=False), # split_number=20, ), )) ###################### ## kdj的macd # Bar-2 (Overlap Bar + Line) macd_kdj_bar = ( Bar().add_xaxis(xaxis_data=date).add_yaxis( series_name="MACD_KDJ", y_axis=echarts_data['kdj_macd'], xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), itemstyle_opts=opts.ItemStyleOpts(color=JsCode(""" function(params) { var colorList; if (params.data >= 0) { colorList = '#ef232a'; } else { colorList = '#14b143'; } return colorList; } """)), ).set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", grid_index=2, axislabel_opts=opts.LabelOpts(is_show=False), # axisline_opts=opts.AxisLineOpts(is_on_zero=False), axistick_opts=opts.AxisTickOpts(is_show=False), # 不显示刻度 # splitline_opts=opts.SplitLineOpts(is_show=False), # 不显示刻度 # axislabel_opts=opts.LabelOpts(is_show=False), # split_number=20, ), yaxis_opts=opts.AxisOpts( grid_index=2, split_number=4, axisline_opts=opts.AxisLineOpts(is_on_zero=False), axistick_opts=opts.AxisTickOpts(is_show=False), splitline_opts=opts.SplitLineOpts(is_show=False), axislabel_opts=opts.LabelOpts(is_show=True), ), legend_opts=opts.LegendOpts(is_show=False), )) macd_kdj_line = ( Line().add_xaxis(xaxis_data=date).add_yaxis( series_name="KDJ_DIFF", y_axis=echarts_data['kdj_macd_diff'], # xaxis_index=2, # yaxis_index=2, is_symbol_show=False, # 去掉折线上的小圆点 label_opts=opts.LabelOpts(is_show=False), ).add_yaxis( series_name="KDJ_DEA", y_axis=echarts_data["kdj_macd_dea"], # xaxis_index=2, # yaxis_index=2, is_symbol_show=False, # 去掉折线上的小圆点 label_opts=opts.LabelOpts(is_show=False), ) # .set_global_opts(legend_opts=opts.LegendOpts(is_show=False)) # .set_global_opts(xaxis_opts=opts.AxisOpts(type_="category")) ) # MACD BAR And MACD Line bar_macd_kdj_line = macd_kdj_bar.overlap(macd_kdj_line) ###################### # Grid Overlap + Bar grid_chart = Grid(init_opts=opts.InitOpts( width="1000px", height="800px", animation_opts=opts.AnimationOpts(animation=False), )) # 这个是为了把 data.datas 这个数据写入到 html 中,还没想到怎么跨 series 传值 # demo 中的代码也是用全局变量传的 grid_chart.add_js_funcs("var barData = {}".format(kline_data)) grid_chart.add( overlap_kline_line, grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", height="30%"), ) grid_chart.add( bar, grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", pos_top="35%", height="10%"), ) # 加上MACD grid_chart.add( bar_macd_line, grid_opts=opts.GridOpts( pos_left="10%", pos_right="8%", pos_top="45%", height="10%", ), ) # 加上KDJ grid_chart.add( kdj_line, grid_opts=opts.GridOpts( pos_left="10%", pos_right="8%", pos_top="55%", height="10%", ), ) # 加上KDJ的MACD grid_chart.add( bar_macd_kdj_line, grid_opts=opts.GridOpts( pos_left="10%", pos_right="8%", pos_top="65%", height="10%", ), ) grid_chart.render("300368.html")
def get_year_chart(year: str): map_data = [[[x["name"], x["value"]] for x in d["data"]] for d in MapData if d["time"] == year][0] min_data, max_data = (minNum, maxNum) data_mark: List = [] i = 0 for x in time_list: if x == year: data_mark.append(total_num[i]) else: data_mark.append("") i = i + 1 map_chart = (Map().add( series_name="", data_pair=map_data, zoom=1, center=[119.5, 34.5], is_map_symbol_show=False, itemstyle_opts={ "normal": { "areaColor": "#323c48", "borderColor": "#404a59" }, "emphasis": { "label": { "show": Timeline }, "areaColor": "rgba(255,255,255, 0.5)", }, }, ).set_global_opts( title_opts=opts.TitleOpts( title="" + str(year) + "全国各省份NCP实时动态(数据来源:丁香园; 数据仓库:BlankerL/DXY-2019-nCoV-Data)", subtitle="", pos_left="center", pos_top="top", title_textstyle_opts=opts.TextStyleOpts( font_size=25, color="rgba(255,255,255, 0.9)"), ), tooltip_opts=opts.TooltipOpts( is_show=True, formatter=JsCode("""function(params) { if ('value' in params.data) { return params.data.value[2] + ': ' + params.data.value[0]; } }"""), ), visualmap_opts=opts.VisualMapOpts( is_calculable=True, dimension=0, pos_left="30", pos_top="center", range_text=["High", "Low"], range_color=["lightskyblue", "yellow", "orangered"], textstyle_opts=opts.TextStyleOpts(color="#ddd"), min_=min_data, max_=max_data, ), )) line_chart = (Line().add_xaxis(time_list).add_yaxis( "", total_num).add_yaxis( "", data_mark, markpoint_opts=opts.MarkPointOpts( data=[opts.MarkPointItem(type_="max")]), ).set_series_opts(label_opts=opts.LabelOpts( is_show=False)).set_global_opts(title_opts=opts.TitleOpts( title="全国各省份NCP实时动态(单位: K)", pos_left="62%", pos_top="5%"))) bar_x_data = [x[0] for x in map_data] bar_y_data = [{"name": x[0], "value": x[1][0]} for x in map_data] bar = (Bar().add_xaxis(xaxis_data=bar_x_data).add_yaxis( series_name="", yaxis_data=bar_y_data, label_opts=opts.LabelOpts(is_show=True, position="right", formatter="{b} : {c}"), ).reversal_axis().set_global_opts( xaxis_opts=opts.AxisOpts(max_=40000, axislabel_opts=opts.LabelOpts(is_show=False)), yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(is_show=False)), tooltip_opts=opts.TooltipOpts(is_show=False), visualmap_opts=opts.VisualMapOpts( is_calculable=True, dimension=0, pos_left="10", pos_top="top", range_text=["High", "Low"], range_color=["lightskyblue", "yellow", "orangered"], textstyle_opts=opts.TextStyleOpts(color="#ddd"), min_=min_data, max_=max_data, ), )) pie_data = [[x[0], x[1][0]] for x in map_data] pie = (Pie().add( series_name="", data_pair=pie_data, radius=["15%", "35%"], center=["80%", "82%"], itemstyle_opts=opts.ItemStyleOpts(border_width=1, border_color="rgba(0,0,0,0.5)"), ).set_global_opts( tooltip_opts=opts.TooltipOpts(is_show=True, formatter="{b} {d}%"), legend_opts=opts.LegendOpts(is_show=False), )) grid_chart = (Grid().add( bar, grid_opts=opts.GridOpts(pos_left="10", pos_right="45%", pos_top="50%", pos_bottom="5"), ).add( line_chart, grid_opts=opts.GridOpts(pos_left="65%", pos_right="80", pos_top="10%", pos_bottom="50%"), ).add(pie, grid_opts=opts.GridOpts(pos_left="45%", pos_top="60%")).add( map_chart, grid_opts=opts.GridOpts())) return grid_chart
iron_man= [{"value": [6, 3, 5, 3, 5, 3], "name": "钢铁侠"}] black_widow = [{"value": [3, 3, 2, 3, 2, 7], "name": "黑寡妇"}] hawkeye = [{"value": [3, 3, 3, 2, 3, 7], "name": "鹰眼"}] hulk = [{"value": [2, 7, 3, 7, 1, 3], "name": "绿巨人"}] thor = [{"value": [2, 7, 6, 7, 7, 6], "name": "雷神"}] myschema = [ {"name": '智力', "max": 7, "min": 0}, {"name": '力量', "max": 7, "min": 0}, {"name": '速度', "max": 7, "min": 0}, {"name": '耐力', "max": 7, "min": 0}, {"name": '能量发射', "max": 7, "min": 0}, {"name": '战斗技能', "max": 7, "min": 0} ] #设置雷达图的属性 r = Radar(init_opts=opts.InitOpts( bg_color={"type": "pattern", "image": JsCode("img"), "repeat": "no-repeat"} ) ) #初始化雷达图 r.add_js_funcs( """ var img = new Image(); img.src = 'a5.png'; """ ) #执行js代码 ( r.add_schema( schema=myschema, shape="circle", #图片形状 center=["50%", "50%"], #图片中心位置 radius="80%", #图片半径大小 angleaxis_opts=opts.AngleAxisOpts(
from pyecharts import options as opts from pyecharts.charts import Bar from pyecharts.commons.utils import JsCode from pyecharts.faker import Faker c = (Bar().add_xaxis(Faker.choose()).add_yaxis( "商家A", Faker.values(), category_gap="60%").set_series_opts( itemstyle_opts={ "normal": { "color": JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1, [{ offset: 0, color: 'rgba(0, 244, 255, 1)' }, { offset: 1, color: 'rgba(0, 77, 167, 1)' }], false)"""), "barBorderRadius": [30, 30, 30, 30], "shadowColor": "rgb(0, 160, 221)", } }).set_global_opts(title_opts=opts.TitleOpts( title="Bar-渐变圆柱")).render("Bar_border_radius.html"))
def generate_line_html(rows, select=None): # 用散点图展示 line = Line( opts.InitOpts(height='700px', width='1424px', theme=ThemeType.LIGHT)) x = [] y1 = [] y2 = [] y3 = [] y4 = [] y5 = [] for row in rows: x.append(row['时间']) y3.append(row['低溢价率策略累积收益率']) y2.append(row['高收益率策略累积收益率']) y1.append(row['低余额+双低策略累积收益率']) y1.append(row['低溢价率+双低策略累积收益率']) # y4.append(row['可转债指数累积收益率']) # y5.append(row['沪深300累积收益率']) line.add_xaxis(x) line.add_yaxis("低溢价率策略", y3) line.add_yaxis("高收益率策略", y2) line.add_yaxis("低余额+双低策略", y1) line.add_yaxis("低溢价+双低策略", y1) # line.add_yaxis("可转债指数", y4) # line.add_yaxis("沪深300", y5) line.set_global_opts( title_opts=opts.TitleOpts(title="策略组合收益率", pos_left='center', pos_top=-5), tooltip_opts=opts.TooltipOpts( trigger='axis', formatter=JsCode( "function (params) {" "return '<table style=\"width:150px;\">'+" "'<tr ><td style=\"height:20px;background-color:white;border:0px\" colspan=2>'+ params[0].data[0] +'</td></tr>' +" "'<tr><td style=\"height:15px;background-color:white;border:0px;text-align: left;color:'+params[1].color+'\">高收益率策略</td><td style=\"height:15px;background-color:white;border:0px\">' + params[1].value[1] + '%</td></tr>' +" "'<tr><td style=\"height:15px;background-color:white;border:0px;text-align: left;color:'+params[2].color+'\">低溢价率策略</td><td style=\"height:15px;background-color:white;border:0px\">' + params[2].value[1] + '%</td></tr>' +" "'<tr ><td style=\"height:15px;background-color:white;border:0px;text-align: left;color:'+params[0].color+'\">低余额+双低策略</td><td style=\"height:15px;background-color:white;border:0px\">' + params[3].value[1] + '%</td></tr>' +" "'<tr ><td style=\"height:15px;background-color:white;border:0px;text-align: left;color:'+params[0].color+'\">低溢价率+双低策略</td><td style=\"height:15px;background-color:white;border:0px\">' + params[4].value[1] + '%</td></tr>' +" "'<tr><td style=\"height:15px;background-color:white;border:0px;text-align: left;color:'+params[3].color+'\">可转债指数</td><td style=\"height:15px;background-color:white;border:0px\">' + params[5].value[1] + '%</td></tr>' +" "'<tr><td style=\"height:15px;background-color:white;border:0px;text-align: left;color:'+params[4].color+'\">沪深300</td><td style=\"height:15px;background-color:white;border:0px\">' + params[6].value[1] + '%</td></tr>' +" "'</table>';}")), legend_opts=opts.LegendOpts(pos_top=50, # selected_mode='single' ), datazoom_opts={ 'start': 0, 'end': 100 }, toolbox_opts=opts.ToolboxOpts(feature={ 'dataZoom': {}, }), # visualmap_opts=opts.VisualMapOpts( # type_="color", max_=150, min_=20, dimension=1 # ), xaxis_opts=opts.AxisOpts( # data=None, type_='time', name='时间', name_gap=30, is_scale=True, name_location='middle', splitline_opts=opts.SplitLineOpts(is_show=False), # axislabel_opts=opts.LabelOpts(formatter="{value}"), #echarts.format.formatTime('yy-MM-dd', value*1000) axisline_opts=opts.AxisLineOpts(is_on_zero=False, symbol=['none', 'arrow'])), yaxis_opts=opts.AxisOpts( type_='value', name='收益率(%)', name_rotate=90, name_gap=55, name_location='middle', is_scale=True, axislabel_opts=opts.LabelOpts(formatter='{value}%'), splitline_opts=opts.SplitLineOpts(is_show=False), axisline_opts=opts.AxisLineOpts(is_on_zero=False, symbol=['none', 'arrow']))) line.set_series_opts( symbol='none', smooth=False, label_opts=opts.LabelOpts(is_show=False), ) line_html = line.render_embed('template.html', env) return line_html