def plot_positions(self, position_list): lst_xaxis = self.df_unitAxis.loc[ self.df_unitAxis['timeAxis'] >= self.trade_start]['unit_intdate'].astype(str).values.tolist( ) # xaxis values has to be STRING type, int will not work linechart = (Line().add_xaxis(lst_xaxis)) # heartbeat的dateindex个数会>=position的timeindex个数,因为并不是没一轮market event循环都会有signal,order等事件触发,由此并不是每天都会生成position for pos in position_list: if pos.fname is not None: df = pd.read_csv(pos.fname, encoding=cfg.FILE_ENCODE) df_cash = df.loc[df['ts_code'] == 'cash'].groupby( 'timeindex').agg({'market_value': 'sum'}) df = df.groupby('timeindex').agg({'market_value': 'sum'}) linename = '{}持仓'.format(pos.name) linename_cash = '{}现金持仓'.format(pos.name) assert lst_xaxis == df.index.astype(str).values.tolist() lst_values = df['market_value'].values.tolist() lst_valuesCash = df_cash['market_value'].values.tolist() linechart.add_yaxis( linename, lst_values, is_smooth=True, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=3, opacity=0.3), label_opts=opts.LabelOpts(is_show=False), ) linechart.add_yaxis( linename_cash, lst_valuesCash, is_smooth=True, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=3, opacity=0.3), label_opts=opts.LabelOpts(is_show=False), itemstyle_opts=opts.ItemStyleOpts(color="#bbbbbb", ), ) linechart.set_global_opts( title_opts=opts.TitleOpts(title='持仓曲线', ), xaxis_opts=opts.AxisOpts(type_="category"), yaxis_opts=opts.AxisOpts( name="市场价值(元)", is_scale=True, ), legend_opts=opts.LegendOpts(is_show=True, pos_top='5%', pos_left="center"), datazoom_opts=[ opts.DataZoomOpts( is_show=False, type_="inside", xaxis_index=[0], range_start=75, range_end=100, ), opts.DataZoomOpts( is_show=True, xaxis_index=[0], type_="slider", pos_top="90%", range_start=75, 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", font_size=10), ), 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", ), ) # put everything in a grid for easy resizing and positioning gridChart = Grid() gridChart.add( linechart, grid_opts=opts.GridOpts(pos_left="10%", pos_right="8%", pos_top='25%'), ) fname = f'{cfg.PATH_POSFILE}{pos.name}.html' gridChart.render(fname) self.chart = gridChart #输出至可访问对象属性中
), xaxis_opts=opts.AxisOpts( type_="category", axispointer_opts=opts.AxisPointerOpts(is_show=True, type_="shadow"), ), yaxis_opts=opts.AxisOpts( name="水量", type_="value", min_=0, max_=250, interval=50, axislabel_opts=opts.LabelOpts(formatter="{value} ml"), axistick_opts=opts.AxisTickOpts(is_show=True), splitline_opts=opts.SplitLineOpts(is_show=True), ), ) ) line = ( Line() .add_xaxis(xaxis_data=x_data) .add_yaxis( series_name="平均温度", yaxis_index=1, y_axis=[2.0, 2.2, 3.3, 4.5, 6.3, 10.2, 20.3, 23.4, 23.0, 16.5, 12.0, 6.2], label_opts=opts.LabelOpts(is_show=False), ) ) bar.overlap(line).render("mixed_bar_and_line.html")
def zhaopin(): zhaopin_data, zhaopin_account = pip_data(keyword='招聘') cve_data, cve_account = pip_data(keyword='cve') yujing_data, yujing_account = pip_data(keyword='预警') loudong_data, loudong_account = pip_data(keyword='漏洞') fuxain_data, fuxain_account = pip_data(keyword='复现') zongjie_data, zongjie_account = pip_data(keyword='总结') paixu = {} quanneng = {} accounts_list = list( set(cve_data[0:20] + yujing_data[0:20] + loudong_data[0:20] + fuxain_data[0:20] + zongjie_data[0:20])) for i in list( set(cve_data[0:20] + yujing_data[0:20] + loudong_data[0:20] + fuxain_data[0:20] + zongjie_data[0:20])): print(i) paixu[i]=cve_account.get(i,0)/1094/5+\ yujing_account.get(i,0)/834/5+\ loudong_account.get(i,0)/5399/5+\ fuxain_account.get(i,0)/255/5+\ zongjie_account.get(i,0)/603/5 quanneng[i] = [ cve_account.get(i, 0) / 1094 * 100, yujing_account.get(i, 0) / 834 * 100, loudong_account.get(i, 0) / 5399 * 100, fuxain_account.get(i, 0) / 255 * 100, zongjie_account.get(i, 0) / 603 * 100, ] print( cve_account.get(i, 0) / 1094, yujing_account.get(i, 0) / 834, loudong_account.get(i, 0) / 5399, fuxain_account.get(i, 0) / 255, zongjie_account.get(i, 0) / 603, ) from operator import itemgetter print(sorted(paixu.items(), key=itemgetter(1), reverse=True)) print('招聘信息条数', (sum(x for x in zhaopin_account.values()))) print('cve信息条数top20', (sum(cve_account.get(x, 0) for x in cve_data[0:20]))) print('预警信息条数top20', (sum(yujing_account.get(x, 0) for x in yujing_data[0:20]))) print('漏洞信息条数top20', (sum(loudong_account.get(x, 0) for x in loudong_data[0:20]))) print('复现信息条数top20', (sum(fuxain_account.get(x, 0) for x in fuxain_data[0:20]))) print('总结信息条数top20', (sum(zongjie_account.get(x, 0) for x in zongjie_data[0:20]))) print('预警信息条数', (sum(x for x in yujing_account.values()))) print('漏洞信息条数', (sum(x for x in loudong_account.values()))) print('复现信息条数', (sum(x for x in fuxain_account.values()))) print('总结信息条数', (sum(x for x in zongjie_account.values()))) # c = ( # Pie({"width": "1700px", "height": "900px"}) # # .add( # "‘cve’发布统计", # # cve_data[0:20], # radius=[46, 80], # center=["30%", "30%"], # is_clockwise=False, # label_opts=opts.LabelOpts(is_show=False), # ) # # .add( # "‘预警’发布统计", # yujing_data[0:20], # radius=[46, 80], # center=["58%", "30%"], # is_clockwise=False, # label_opts=opts.LabelOpts(is_show=False), # ) # .add( # "‘漏洞’发布统计", # loudong_data[0:20], # radius=[46, 80], # center=["85%", "30%"], # is_clockwise=False, # label_opts=opts.LabelOpts(is_show=False), # ) # .add( # "‘复现’发布统计", # fuxain_data[0:20], # radius=[46, 80], # center=["30%", "70%"], # is_clockwise=False, # label_opts=opts.LabelOpts(is_show=False), # ) # .add( # "‘总结’发布统计", # zongjie_data[0:20], # radius=[46, 80], # center=["58%", "70%"], # is_clockwise=False, # label_opts=opts.LabelOpts(is_show=False), # ) # .add( # "‘招聘’发布统计", # zhaopin_data[0:20], # radius=[46, 80], # center=["85%", "70%"], # is_clockwise=False, # label_opts=opts.LabelOpts(is_show=False), # ) # .set_global_opts(title_opts=opts.TitleOpts(title="2019年微信公众号文章主题数据统计图(top20)", pos_left='center'), # legend_opts=opts.LegendOpts(type_='scroll', is_show=True, pos_left="5%", pos_top='5%', # orient="vertical")) # .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}")) # ) # # # # page = Page(layout=Page.SimplePageLayout) # # 需要自行调整每个 chart 的 height/width,显示效果在不同的显示器上可能不同 # # page.add(c) # # c.render(path='./static/year/pie.html') # return c c = ( Line({ "width": "1500px", "height": "700px" }).add_xaxis(['cve', '预警', '漏洞', '复现', '总结']).add_yaxis( "嘶吼专业版", quanneng['嘶吼专业版'], is_smooth=True, label_opts=opts.LabelOpts(is_show=False)).add_yaxis( "FreeBuf", quanneng['FreeBuf'], is_smooth=True, label_opts=opts.LabelOpts(is_show=False)).add_yaxis( "邑安全", quanneng['邑安全'], is_smooth=True, label_opts=opts.LabelOpts(is_show=False)).add_yaxis( "山石瞭望", quanneng['山石瞭望'], is_smooth=True, label_opts=opts.LabelOpts(is_show=False)).add_yaxis( "360CERT", quanneng['360CERT'], is_smooth=True, label_opts=opts.LabelOpts( is_show=False)).add_yaxis( "腾讯御见威胁情报中心", quanneng['腾讯御见威胁情报中心'], is_smooth=True, label_opts=opts.LabelOpts(is_show=False)). add_yaxis( "绿盟科技", quanneng['绿盟科技'], is_smooth=True, label_opts=opts.LabelOpts(is_show=False)).add_yaxis( "Timeline Sec", quanneng['Timeline Sec'], is_smooth=True, label_opts=opts.LabelOpts(is_show=False)).add_yaxis( "长亭安全课堂", quanneng['长亭安全课堂'], is_smooth=True, label_opts=opts.LabelOpts(is_show=False)).add_yaxis( "合天智汇", quanneng['合天智汇'], is_smooth=True, label_opts=opts.LabelOpts(is_show=False)).add_yaxis( "绿盟科技安全情报", quanneng['绿盟科技安全情报'], is_smooth=True, label_opts=opts.LabelOpts( is_show=False)).add_yaxis( "E安全", quanneng['E安全'], is_smooth=True, label_opts=opts.LabelOpts(is_show=False)). add_yaxis( "信安之路", quanneng['信安之路'], is_smooth=True, label_opts=opts.LabelOpts(is_show=False)).add_yaxis( "黑白之道", quanneng['Seebug漏洞平台'], is_smooth=True, label_opts=opts.LabelOpts(is_show=False)).add_yaxis( "维他命安全", quanneng['维他命安全'], is_smooth=True, label_opts=opts.LabelOpts(is_show=False)).add_yaxis( "无级安全", quanneng['无级安全'], is_smooth=True, label_opts=opts.LabelOpts(is_show=False)).add_yaxis( "安全客", quanneng['安全客'], is_smooth=True, label_opts=opts.LabelOpts( is_show=False)).add_yaxis( "弥天安全实验室", quanneng['弥天安全实验室'], is_smooth=True, label_opts=opts.LabelOpts(is_show=False)). add_yaxis( "HACK学习呀", quanneng['HACK学习呀'], is_smooth=True, label_opts=opts.LabelOpts(is_show=False)).add_yaxis( "Tide安全团队", quanneng['Tide安全团队'], is_smooth=True, label_opts=opts.LabelOpts(is_show=False)).add_yaxis( "SecPulse安全脉搏", quanneng['SecPulse安全脉搏'], is_smooth=True, label_opts=opts.LabelOpts(is_show=False)).add_yaxis( "雷神众测", quanneng['雷神众测'], is_smooth=True, label_opts=opts.LabelOpts(is_show=False)).add_yaxis( "安全祖师爷", quanneng['安全祖师爷'], is_smooth=True, label_opts=opts.LabelOpts( is_show=False)).add_yaxis( "洛米唯熊", quanneng['洛米唯熊'], is_smooth=True, label_opts=opts.LabelOpts(is_show=False)). add_yaxis("飓风网络安全", quanneng['飓风网络安全'], is_smooth=True, label_opts=opts.LabelOpts(is_show=False)).add_yaxis( "网信防务", quanneng['网信防务'], is_smooth=True, label_opts=opts.LabelOpts(is_show=False)).add_yaxis( "小白帽学习之路", quanneng['小白帽学习之路'], is_smooth=True, label_opts=opts.LabelOpts(is_show=False)).add_yaxis( "西子实验室", quanneng['西子实验室'], is_smooth=True, label_opts=opts.LabelOpts(is_show=False)) # .set_series_opts( # areastyle_opts=opts.AreaStyleOpts(opacity=0.5), # ) .set_global_opts( title_opts=opts.TitleOpts(title="2019年微信公众号主题折线图", pos_left='43%', pos_top='8%'), # xaxis_opts=opts.AxisOpts( # axistick_opts=opts.AxisTickOpts(is_align_with_label=True), # is_scale=False, # boundary_gap=False, # ), # legend_opts=opts.LegendOpts(is_show=False), )) c.render(path='./static/year/quanneng.html') print('生成全能公众号')
def picture2(self): df = pd.read_sql( f"select * from {self.table_name} where 检查时间 LIKE '%{self.last_month}%'", self.conn) df['time'] = pd.to_datetime(df['检查时间']) df['time_H'] = df['time'].apply(lambda x: x.hour) x = df['time_H'].sort_values(ascending=True).unique() ya = [] for i in x: try: bkk = df[df['time_H'] == i]['性质'].value_counts()['A类'] ya.append(str(bkk)) except: bkk = 0 ya.append(str(bkk)) # print(ya, len(ya)) yb = [] for i in x: try: bkk = df[df['time_H'] == i]['性质'].value_counts()['B类'] yb.append(str(bkk)) except: bkk = 0 yb.append(str(bkk)) # print(yb, len(yb)) yc = [] for i in x: try: bkk = df[df['time_H'] == i]['性质'].value_counts()['C类'] yc.append(str(bkk)) except: bkk = 0 yc.append(str(bkk)) # print(yc, len(yc)) yd = [] for i in x: try: bkk = df[df['time_H'] == i]['性质'].value_counts()['D类'] yd.append(str(bkk)) except: bkk = 0 yd.append(str(bkk)) # print(yd, len(yd)) a = [] for i in x: m = str(i) + ':00' a.append(m) e = ( Line().add_xaxis(a).add_yaxis("A类", ya).add_yaxis( "B类", yb).add_yaxis("C类", yc).add_yaxis("D类", yd).set_global_opts( title_opts=opts.TitleOpts( title=f"现场安全信息性质分布(时)", subtitle=f"统计时间:{self.last_month}"), tooltip_opts=opts.TooltipOpts(trigger="axis"), xaxis_opts=opts.AxisOpts(name="时间"), toolbox_opts=opts.ToolboxOpts(is_show=True, feature={ "saveAsImage": { 'backgroundColor': 'white' }, "dataZoom": {}, "restore": {}, "magicType": { "show": True, "type": ["line", "bar"] }, "dataView": {} })) # .render(f"safe_message_hour_{self.table_name}.html") ) print('已画图成功') return e
from pywebio.output import put_html from pyecharts import options as opts from pyecharts.charts import Line, Scatter from pyecharts.faker import Faker x = Faker.choose() line = ( Line() .add_xaxis(x) .add_yaxis("商家A", Faker.values()) .add_yaxis("商家B", Faker.values()) .set_global_opts(title_opts=opts.TitleOpts(title="Overlap-line+scatter")) ) scatter = ( Scatter() .add_xaxis(x) .add_yaxis("商家A", Faker.values()) .add_yaxis("商家B", Faker.values()) ) line.overlap(scatter) put_html(line.render_notebook())
def TREND_render(x,y,z,y_up,y_down,max_index,min_index,x_name,y_name,query,answer): x=list(map(str,x)) y=list(map(float,y)) bar = ( Bar() .add_xaxis(xaxis_data=x) .add_yaxis( series_name="increase_value", y_axis=y_up, markpoint_opts=opts.MarkPointOpts( data=[opts.MarkPointItem(type_='max')] ), ) # .add_yaxis(series_name="increase", yaxis_data=y_up, stack="GDP",markpoint_opts=opts.MarkPointOpts( # data=[opts.MarkPointItem(name=x[max_index], coord=[x[max_index], y[max_index]+y_up[max_index]+z[max_index]], value="Max")] # ),) .add_yaxis(series_name="decrease_value", y_axis=y_down, stack="GDP",markpoint_opts=opts.MarkPointOpts( data=[opts.MarkPointItem(type_='max')] ),) .set_global_opts( datazoom_opts=[opts.DataZoomOpts(range_start=10, range_end=90), opts.DataZoomOpts(type_="inside")], yaxis_opts=opts.AxisOpts( name=y_name, type_="value", axislabel_opts=opts.LabelOpts(formatter="{value}"), axistick_opts=opts.AxisTickOpts(is_show=True), splitline_opts=opts.SplitLineOpts(is_show=True), ), xaxis_opts=opts.AxisOpts(name=x_name), graphic_opts=[opts.GraphicText( graphic_item=opts.GraphicItem( left="center", top="bottom", ), graphic_textstyle_opts=opts.GraphicTextStyleOpts( # 可以通过jsCode添加js代码,也可以直接用字符串 text=['\n'+"Q:"+' '+query+'\n'+"\n"+'A:'+' '+answer], font="14px Microsoft YaHei", graphic_basicstyle_opts=opts.GraphicBasicStyleOpts( fill="#333" ) ) )] ) ) line = ( Line() .add_xaxis(xaxis_data=x) .add_yaxis( series_name='food', yaxis_index=0, y_axis=y, label_opts=opts.LabelOpts(is_show=True), # markpoint_opts=opts.MarkPointOpts( # data=[opts.MarkPointItem(type_='max', value='Max'),opts.MarkPointItem(type_='min',value='Max')], # ), ) .set_global_opts(legend_opts=opts.LegendOpts(is_show=False), ) ) # line.overlap(bar).render("TREND.html") grid = Grid(init_opts=opts.InitOpts( width="100%", height="100%", renderer=globals.RenderType.SVG, )) grid.add(bar.overlap(line), grid_opts={'left': '20%', 'bottom': '34%'}) option1 = grid.dump_options_with_quotes() option1 = json.loads(option1) option = {"option": [option1], "query": query} return option
class TsdaChart(base_chart.BaseChart): chart = None max_x = None min_x = None def __init__(self, title, xaxis_name, yaxis_name): base_chart.BaseChart.__init__(self, title, xaxis_name, yaxis_name) def clear(self): self.data.clear() def set_data(self, **data): if ('x' in data) & ('y' in data): self.max_x = max(data['x']) self.min_x = min(data['x']) if 'label' in data: self.data.append([data['x'], data['y'], data['label']]) else: self.data.append([data['x'], data['y']]) return self def show(self): return self.chart def plot(self): self.chart = Line(init_opts=opts.InitOpts(page_title=self.title)) # load data self.chart.add_xaxis(self.data[0][0]) index = 0 for data_set in self.data: if len(data_set) > 2: # get label from data set label = data_set[2] else: label = self.yaxis_name + str(index) if index == 0: print('append line:', data_set[0]) print(data_set[1]) self.chart.add_yaxis(label, data_set[1]) else: print('append bar:', data_set[0]) print(data_set[1]) bar = Bar() bar.add_xaxis(data_set[0]) bar.add_yaxis(label, data_set[1]) self.chart.overlap(bar) index += 1 # set options self.chart.set_global_opts( title_opts=opts.TitleOpts(title=self.title), toolbox_opts=opts.ToolboxOpts(is_show=True), datazoom_opts=opts.DataZoomOpts(is_show=True, type_='slider', range_start=0, range_end=100), # xaxis_opts=opts.AxisOpts(name=self.xaxis_name, type_='time', name_location='end', name_gap=15, # splitline_opts=opts.SplitLineOpts(is_show=True), # min_=self.min_x, max_=self.max_x), yaxis_opts=opts.AxisOpts( name=self.yaxis_name, name_location='center', name_gap=25, splitline_opts=opts.SplitLineOpts(is_show=True))) self.chart.set_series_opts( label_opts=opts.LabelOpts(is_show=False, position='inside')) return self
def report(request): """返回慢SQL历史趋势""" checksum = request.GET.get('checksum') cnt_data = ChartDao().slow_query_review_history_by_cnt(checksum) pct_data = ChartDao().slow_query_review_history_by_pct_95_time(checksum) cnt_x_data = [row[1] for row in cnt_data['rows']] cnt_y_data = [int(row[0]) for row in cnt_data['rows']] pct_y_data = [str(row[0]) for row in pct_data['rows']] line = Line(init_opts=opts.InitOpts(width='800', height='380px')) line.add_xaxis(cnt_x_data) line.add_yaxis("慢查次数", cnt_y_data, is_smooth=True, markline_opts=opts.MarkLineOpts(data=[ opts.MarkLineItem(type_="max", name='最大值'), opts.MarkLineItem(type_="average", name='平均值') ])) line.add_yaxis("慢查时长(95%)", pct_y_data, is_smooth=True, is_symbol_show=False) line.set_series_opts(areastyle_opts=opts.AreaStyleOpts(opacity=0.5, )) line.set_global_opts( title_opts=opts.TitleOpts(title='SQL历史趋势'), legend_opts=opts.LegendOpts(selected_mode='single'), xaxis_opts=opts.AxisOpts( axistick_opts=opts.AxisTickOpts(is_align_with_label=True), is_scale=False, boundary_gap=False, ), ) result = {"status": 0, "msg": '', "data": line.render_embed()} return HttpResponse(json.dumps(result), content_type='application/json')
def draw_balance_line(xaxis, yaxis, title="消费统计", markline=None, width=2000) -> Line: """ x = [月_日, 月_日, 月_日, ....] y = [(title1, [num1, num2, num3, num4, ...]), (title2, [num1, num2, num3, num4, ...])] :param xaxis: x轴 :param yaxis: y轴 :param title: 标题 :param markline: 标记辅助线 :param width: 宽 :return: Line """ line = Line() line.add_xaxis(xaxis) for name, axis in yaxis: line.add_yaxis(name, axis) line.set_global_opts(title_opts=opts.TitleOpts(title=title, ), datazoom_opts=[opts.DataZoomOpts(range_start=0, range_end=100), opts.DataZoomOpts(type_="inside")], tooltip_opts=opts.TooltipOpts(trigger='axis', axis_pointer_type='shadow')) line.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) if markline is not None: line.set_series_opts(markline_opts=opts.MarkLineOpts( data=[opts.MarkLineItem( y=markline, name='预算') ]) ) return line
def draw_pnl(trader_sim_obj) -> Grid: # 【1】 画Returns trader_name = trader_sim_obj.name df_Pnl = pd.DataFrame(trader_sim_obj.Data.Pnl) df_Pnl = df_Pnl.sort_values(by='Date') df_Pnl['cumsum'] = df_Pnl['Returns'].cumsum() x_list = df_Pnl['Date'].dt.date.to_list() y_list = df_Pnl['cumsum'].to_list() line_returns = (Line().add_xaxis(x_list).add_yaxis( series_name=trader_name, y_axis=y_list).set_global_opts( title_opts=opts.TitleOpts(title='Returns', pos_top='10%'), legend_opts=opts.LegendOpts(pos_top='0%'), datazoom_opts=opts.DataZoomOpts(is_show=True, xaxis_index=[0, 1], pos_top='60%'), xaxis_opts=opts.AxisOpts( splitline_opts=opts.SplitLineOpts(is_show=True), is_scale=True, ), yaxis_opts=opts.AxisOpts(is_scale=True), ).set_series_opts( label_opts='False', markpoint_opts=opts.MarkPointOpts(data=[ opts.MarkPointItem(type_='max', symbol='circle'), ]), )) # 【2】 画MDD df_Pnl['cummax'] = df_Pnl['cumsum'].cummax() df_Pnl['drawDown'] = df_Pnl['cumsum'] - df_Pnl['cummax'] x_list = df_Pnl['Date'].dt.date.to_list() round_n = get_round_pos(df_Pnl['drawDown']) y_list = round(df_Pnl['drawDown'], round_n).to_list() line_mdd = ( Line().add_xaxis(x_list).add_yaxis( series_name=trader_name, y_axis=y_list, ).set_global_opts( title_opts=opts.TitleOpts(title='MDD', pos_top='75%'), legend_opts=opts.LegendOpts(is_show=False), datazoom_opts=opts.DataZoomOpts(is_show=False, xaxis_index=[0, 1]), xaxis_opts=opts.AxisOpts( is_scale=True, splitline_opts=opts.SplitLineOpts(is_show=True)), yaxis_opts=opts.AxisOpts( # max_=0, # min_=y_min - abs((y_max - y_min)) * 0.1 , is_scale=True, splitline_opts=opts.SplitLineOpts(is_show=True, )), ).set_series_opts( label_opts='False', markpoint_opts=opts.MarkPointOpts(data=[ # opts.MarkPointItem(type_='max', symbol='roundRect'), opts.MarkPointItem(type_='min', symbol='circle'), ]), )) # 组合gird grid = (Grid(init_opts=opts.InitOpts(width='1200px', height='800px')).add( line_returns, grid_opts=opts.GridOpts(pos_bottom='40%')).add( line_mdd, grid_opts=opts.GridOpts(pos_top='65%', pos_bottom='5%'))) return grid
def draw_band_and_trades(trader_sim_obj) -> Grid: def band1(x): l = list(x) l.sort() m = sum(l[1:3]) / 2 l2 = [i for i in l if (i > m * 0.95) * (i < m * 1.05)] return max(l2) def band2(x): l = list(x) l.sort() m = sum(l[1:3]) / 2 l2 = [i for i in l if (i > m * 0.95) * (i < m * 1.05)] return min(l2) # 【1】 Band trader_name = trader_sim_obj.name # 拿数据 df_band = pd.DataFrame(trader_sim_obj.Data.Band) df_band.set_index(keys='DateTime', drop=True, inplace=True) df_bar = pd.DataFrame(trader_sim_obj.Data.Bar) # 转换 计算 BarPx df_bar_open_pv = df_bar.pivot_table(values='Open', index='DateTime', columns='ticker', aggfunc='mean') ticker1 = df_bar[df_bar['tickerNum'] == '1']['ticker'].to_list()[-1] ticker2 = df_bar[df_bar['tickerNum'] == '2']['ticker'].to_list()[-1] df_bar_open_pv['px'] = df_bar_open_pv[ticker1] / df_bar_open_pv[ticker2] # 筛选Band 合并 Band和BarPx df_band_px = pd.concat([df_band, df_bar_open_pv[['px']]], axis=1) df_band_px['Band1'] = df_band_px[[ 'BuyEntry', 'BuyExit', 'SellEntry', 'SellExit' ]].apply(func=band1, axis=1) df_band_px['Band2'] = df_band_px[[ 'BuyEntry', 'BuyExit', 'SellEntry', 'SellExit' ]].apply(func=band2, axis=1) df_band_px = df_band_px[['Band1', 'Band2', 'px']] round_n = get_round_pos(df_band_px['px']) df_band_px['px'] = round(df_band_px['px'], round_n) x_list = df_band_px.index.to_list() line_band = ( Line().add_xaxis(xaxis_data=x_list).add_yaxis( series_name='Band1', y_axis=df_band_px['Band1'].to_list(), ).add_yaxis( series_name='Band2', y_axis=df_band_px['Band2'].to_list(), ).add_yaxis( series_name='BarPx', y_axis=df_band_px['px'].to_list(), ).set_global_opts( title_opts=opts.TitleOpts(title='Band', pos_top='10%'), legend_opts=opts.LegendOpts(pos_top='5%'), datazoom_opts=opts.DataZoomOpts(is_show=True, xaxis_index=[0, 1, 2], pos_top='50%'), yaxis_opts=opts.AxisOpts(is_scale=True, splitline_opts=opts.SplitLineOpts( is_show=True, )), xaxis_opts=opts.AxisOpts(is_scale=True, splitline_opts=opts.SplitLineOpts( is_show=True, )), # yaxis_opts=opts.AxisOpts( # max_=y_max+abs((y_max-y_min))*0.15, # min_=y_min-abs((y_max-y_min))*0.15 # ) )) # 【2】 画Trades # 数据 df_position = pd.DataFrame() df_trades = pd.DataFrame(trader_sim_obj.Data.Trades) list_ticker = df_trades['Ticker'].unique().tolist() # 用trades 计算 position # 使用的方法比较复杂, # 能处理 对有跨交易日持仓的情况; # 用于显示持仓,而不是成交,因为只是成交的话无法对成交盈亏有所了然 ticker_position = {} for ticker_i in list_ticker[0]: ticker_position[ticker_i] = {'Buy': [0], 'Sell': [0], 'netPos': [0]} df_i_trades = df_trades[df_trades['Ticker'] == ticker_i] df_i_trades = df_i_trades[[ 'DateTime', 'Direction', 'OffsetFlag', 'TradedPrice', 'TradedVolume' ]] df_i_trades.sort_values(by='DateTime', inplace=True) l_data = df_i_trades[['OffsetFlag', 'Direction', 'TradedVolume']].to_dict('record') for d in l_data: offset_flag = d['OffsetFlag'] direction = d['Direction'] traded_volume = d['TradedVolume'] tv = ((offset_flag == 'Open') * 2 - 1) * traded_volume td = ['Sell', 'Buy'][int(({ 'Buy': 1, 'Sell': -1 }[direction] * ((offset_flag == 'Open') * 2 - 1)) / 2 + 0.5)] volume0 = {} volume0['Buy'] = ticker_position[ticker_i]['Buy'][-1] volume0['Sell'] = ticker_position[ticker_i]['Sell'][-1] volume0['netPos'] = ticker_position[ticker_i]['netPos'][-1] if volume0 == 0 and tv < 0: ticker_position[ticker_i]['Buy'].append(volume0['Buy']) ticker_position[ticker_i]['Sell'].append(volume0['Sell']) ticker_position[ticker_i]['netPos'].append(volume0['netPos']) else: for bs in ['Buy', 'Sell']: if bs == td: ticker_position[ticker_i][bs].append(volume0[bs] + tv) else: ticker_position[ticker_i][bs].append(volume0[bs]) ticker_position[ticker_i]['netPos'].append( ticker_position[ticker_i]['Buy'][-1] - ticker_position[ticker_i]['Sell'][-1]) # print(df_position, ticker_position[ticker_i]) df_position[ticker_i] = ticker_position[ticker_i]['netPos'][1:] # position 数据处理, 规整index轴 df_position['DateTime'] = df_trades['DateTime'] df_position.drop_duplicates(subset='DateTime', keep='last', inplace=True) df_position.set_index('DateTime', inplace=True, drop=True) df_position_all = df_position.reindex(index=df_band_px.index.to_list(), method='ffill') df_position_all.fillna(value=0, inplace=True) x = df_position_all.index.to_list() # 画图 # 仅显示 某一个 ticker的 trades和px # TODO arb(pair成交)的情况,用arbPx图,也是一个图啊 i_ticker = df_position_all.columns.to_list()[0] y_trades = df_position_all[i_ticker].to_list() line_trades = (Line().add_xaxis(x).add_yaxis( series_name=i_ticker, y_axis=y_trades, yaxis_index=0, ).set_global_opts( title_opts=opts.TitleOpts(title='Trades', pos_top='65%'), legend_opts=opts.LegendOpts(pos_top='60%'), datazoom_opts=opts.DataZoomOpts(is_show=False, xaxis_index=[0, 1, 2]), yaxis_opts=opts.AxisOpts(is_scale=True, splitline_opts=opts.SplitLineOpts( is_show=True, )), xaxis_opts=opts.AxisOpts(is_scale=True, splitline_opts=opts.SplitLineOpts( is_show=True, )), )) # ticker 的bar px df_ticker_i_px = pd.DataFrame(df_bar.loc[df_bar['ticker'] == i_ticker, ['DateTime', 'Open']]) df_ticker_i_px.set_index(keys='DateTime', drop=True, inplace=True) df_ticker_i_px = df_ticker_i_px.reindex(index=df_band_px.index.to_list(), method='ffill') y_px_open = df_ticker_i_px['Open'].to_list() line_ticker_px = ( Line().add_xaxis(x).add_yaxis( "价格", y_px_open, yaxis_index=1, ).set_global_opts( title_opts=opts.TitleOpts(title='Px-Open', pos_top='65%', pos_right='0%'), legend_opts=opts.LegendOpts(pos_top='63%'), datazoom_opts=opts.DataZoomOpts(is_show=False, xaxis_index=[0, 1, 2]), # yaxis_opts=opts.AxisOpts(is_scale=True, splitline_opts=opts.SplitLineOpts(is_show=True, )), xaxis_opts=opts.AxisOpts(is_scale=True), yaxis_opts=opts.AxisOpts(position='right', is_scale=True, name='Px'), )) # 组合gird grid = (Grid(init_opts=opts.InitOpts(width='1200px', height='800px')).add( line_band, grid_opts=opts.GridOpts(pos_top='5%', pos_bottom='50%')).add( line_trades, grid_opts=opts.GridOpts(pos_top='55%', pos_bottom='5%')).add( line_ticker_px, grid_opts=opts.GridOpts(pos_top='55%', pos_bottom='5%'))) return grid
def kline_pro(kline: List[dict], fx: List[dict] = None, bi: List[dict] = None, xd: List[dict] = None, bs: List[dict] = None, title: str = "缠中说禅K线分析", width: str = "1400px", height: str = '580px') -> Grid: """绘制缠中说禅K线分析结果 :param kline: K线 :param fx: 分型识别结果 :param bi: 笔识别结果 {'dt': Timestamp('2020-11-26 00:00:00'), 'fx_mark': 'd', 'start_dt': Timestamp('2020-11-25 00:00:00'), 'end_dt': Timestamp('2020-11-27 00:00:00'), 'fx_high': 144.87, 'fx_low': 138.0, 'bi': 138.0} :param xd: 线段识别结果 :param bs: 买卖点 :param title: 图表标题 :param width: 图表宽度 :param height: 图表高度 :return: 用Grid组合好的图表 """ # 配置项设置 # ------------------------------------------------------------------------------------------------------------------ bg_color = "#1f212d" # 背景 up_color = "#F9293E" down_color = "#00aa3b" init_opts = opts.InitOpts(bg_color=bg_color, width=width, height=height, animation_opts=opts.AnimationOpts(False)) title_opts = opts.TitleOpts(title=title, pos_top="1%", title_textstyle_opts=opts.TextStyleOpts(color=up_color, font_size=20), subtitle_textstyle_opts=opts.TextStyleOpts(color=down_color, font_size=12)) label_not_show_opts = opts.LabelOpts(is_show=False) legend_not_show_opts = opts.LegendOpts(is_show=False) red_item_style = opts.ItemStyleOpts(color=up_color) green_item_style = opts.ItemStyleOpts(color=down_color) k_style_opts = opts.ItemStyleOpts(color=up_color, color0=down_color, border_color=up_color, border_color0=down_color, opacity=0.8) legend_opts = opts.LegendOpts(is_show=True, pos_top="1%", pos_left="30%", item_width=14, item_height=8, textstyle_opts=opts.TextStyleOpts(font_size=12, color="#0e99e2")) brush_opts = opts.BrushOpts(tool_box=["rect", "polygon", "keep", "clear"], x_axis_index="all", brush_link="all", out_of_brush={"colorAlpha": 0.1}, brush_type="lineX") axis_pointer_opts = opts.AxisPointerOpts(is_show=True, link=[{"xAxisIndex": "all"}]) dz_inside = opts.DataZoomOpts(False, "inside", xaxis_index=[0, 1, 2], range_start=80, range_end=100) dz_slider = opts.DataZoomOpts(True, "slider", xaxis_index=[0, 1, 2], pos_top="96%", pos_bottom="0%", range_start=80, range_end=100) yaxis_opts = opts.AxisOpts(is_scale=True, axislabel_opts=opts.LabelOpts(color="#c7c7c7", font_size=8, position="inside")) grid0_xaxis_opts = opts.AxisOpts(type_="category", grid_index=0, axislabel_opts=label_not_show_opts, split_number=20, min_="dataMin", max_="dataMax", is_scale=True, boundary_gap=False, axisline_opts=opts.AxisLineOpts(is_on_zero=False)) tool_tip_opts = opts.TooltipOpts( trigger="axis", axis_pointer_type="cross", background_color="rgba(245, 245, 245, 0.8)", border_width=1, border_color="#ccc", position=JsCode(""" function (pos, params, el, elRect, size) { var obj = {top: 10}; obj[['left', 'right'][+(pos[0] < size.viewSize[0] / 2)]] = 30; return obj; } """), textstyle_opts=opts.TextStyleOpts(color="#000"), ) # 数据预处理 # ------------------------------------------------------------------------------------------------------------------ dts = [x['dt'] for x in kline] # k_data = [[x['open'], x['close'], x['low'], x['high']] for x in kline] k_data = [opts.CandleStickItem(name=i, value=[x['open'], x['close'], x['low'], x['high']]) for i, x in enumerate(kline)] vol = [] for i, row in enumerate(kline): item_style = red_item_style if row['close'] > row['open'] else green_item_style bar = opts.BarItem(name=i, value=row['vol'], itemstyle_opts=item_style, label_opts=label_not_show_opts) vol.append(bar) close = np.array([x['close'] for x in kline], dtype=np.double) diff, dea, macd = MACD(close) ma5 = SMA(close, timeperiod=5) ma34 = SMA(close, timeperiod=34) ma233 = SMA(close, timeperiod=233) macd_bar = [] for i, v in enumerate(macd.tolist()): item_style = red_item_style if v > 0 else green_item_style bar = opts.BarItem(name=i, value=round(v, 4), itemstyle_opts=item_style, label_opts=label_not_show_opts) macd_bar.append(bar) diff = diff.round(4) dea = dea.round(4) # K 线主图 # ------------------------------------------------------------------------------------------------------------------ chart_k = Kline() chart_k.add_xaxis(xaxis_data=dts) chart_k.add_yaxis(series_name="Kline", y_axis=k_data, itemstyle_opts=k_style_opts) chart_k.set_global_opts( legend_opts=legend_opts, datazoom_opts=[dz_inside, dz_slider], yaxis_opts=yaxis_opts, tooltip_opts=tool_tip_opts, axispointer_opts=axis_pointer_opts, brush_opts=brush_opts, title_opts=title_opts, xaxis_opts=grid0_xaxis_opts ) # 均线图 # ------------------------------------------------------------------------------------------------------------------ chart_ma = Line() chart_ma.add_xaxis(xaxis_data=dts) ma_keys = {"MA5": ma5, "MA34": ma34, "MA233": ma233} ma_colors = ["#39afe6", "#da6ee8", "#00940b"] for i, (name, ma) in enumerate(ma_keys.items()): chart_ma.add_yaxis(series_name=name, y_axis=ma, is_smooth=True, is_selected=False, symbol_size=0, label_opts=label_not_show_opts, linestyle_opts=opts.LineStyleOpts(opacity=0.8, width=1.0, color=ma_colors[i])) chart_ma.set_global_opts(xaxis_opts=grid0_xaxis_opts, legend_opts=legend_not_show_opts) chart_k = chart_k.overlap(chart_ma) # 缠论结果 # ------------------------------------------------------------------------------------------------------------------ if fx: fx_dts = [x['dt'] for x in fx] fx_val = [x['fx'] for x in fx] chart_fx = Scatter() chart_fx.add_xaxis(fx_dts) chart_fx.add_yaxis(series_name="FX", y_axis=fx_val, is_selected=False, symbol="circle", symbol_size=6, label_opts=label_not_show_opts, itemstyle_opts=opts.ItemStyleOpts(color="rgba(152, 147, 193, 1.0)", )) chart_fx.set_global_opts(xaxis_opts=grid0_xaxis_opts, legend_opts=legend_not_show_opts) chart_k = chart_k.overlap(chart_fx) if bi: bi_dts = [x['dt'] for x in bi] bi_val = [x['bi'] for x in bi] chart_bi = Line() chart_bi.add_xaxis(bi_dts) chart_bi.add_yaxis(series_name="BI", y_axis=bi_val, is_selected=True, symbol="diamond", symbol_size=10, label_opts=label_not_show_opts, itemstyle_opts=opts.ItemStyleOpts(color="rgba(184, 117, 225, 1.0)", ), linestyle_opts=opts.LineStyleOpts(width=1.5)) chart_bi.set_global_opts(xaxis_opts=grid0_xaxis_opts, legend_opts=legend_not_show_opts) chart_k = chart_k.overlap(chart_bi) if xd: xd_dts = [x['dt'] for x in xd] xd_val = [x['xd'] for x in xd] chart_xd = Line() chart_xd.add_xaxis(xd_dts) chart_xd.add_yaxis(series_name="XD", y_axis=xd_val, is_selected=True, symbol="triangle", symbol_size=10, itemstyle_opts=opts.ItemStyleOpts(color="rgba(37, 141, 54, 1.0)", )) chart_xd.set_global_opts(xaxis_opts=grid0_xaxis_opts, legend_opts=legend_not_show_opts) chart_k = chart_k.overlap(chart_xd) if bs: b_dts = [x['dt'] for x in bs if x['mark'] == 'buy'] if len(b_dts) > 0: b_val = [x['price'] for x in bs if x['mark'] == 'buy'] chart_b = Scatter() chart_b.add_xaxis(b_dts) chart_b.add_yaxis(series_name="BUY", y_axis=b_val, is_selected=False, symbol="arrow", symbol_size=8, itemstyle_opts=opts.ItemStyleOpts(color="#f31e1e", )) chart_b.set_global_opts(xaxis_opts=grid0_xaxis_opts, legend_opts=legend_not_show_opts) chart_k = chart_k.overlap(chart_b) s_dts = [x['dt'] for x in bs if x['mark'] == 'sell'] if len(s_dts) > 0: s_val = [x['price'] for x in bs if x['mark'] == 'sell'] chart_s = Scatter() chart_s.add_xaxis(s_dts) chart_s.add_yaxis(series_name="SELL", y_axis=s_val, is_selected=False, symbol="pin", symbol_size=12, itemstyle_opts=opts.ItemStyleOpts(color="#45b97d", )) chart_s.set_global_opts(xaxis_opts=grid0_xaxis_opts, legend_opts=legend_not_show_opts) chart_k = chart_k.overlap(chart_s) # 成交量图 # ------------------------------------------------------------------------------------------------------------------ chart_vol = Bar() chart_vol.add_xaxis(dts) chart_vol.add_yaxis(series_name="Volume", y_axis=vol, bar_width='60%') chart_vol.set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", grid_index=1, axislabel_opts=opts.LabelOpts(is_show=True, font_size=8, color="#9b9da9"), ), yaxis_opts=yaxis_opts, legend_opts=legend_not_show_opts, ) # MACD图 # ------------------------------------------------------------------------------------------------------------------ chart_macd = Bar() chart_macd.add_xaxis(dts) chart_macd.add_yaxis(series_name="MACD", y_axis=macd_bar, bar_width='60%') chart_macd.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, color="#c7c7c7"), ), legend_opts=opts.LegendOpts(is_show=False), ) line = Line() line.add_xaxis(dts) line.add_yaxis(series_name="DIFF", y_axis=diff, label_opts=label_not_show_opts, is_symbol_show=False, linestyle_opts=opts.LineStyleOpts(opacity=0.8, width=1.0, color="#da6ee8")) line.add_yaxis(series_name="DEA", y_axis=dea, label_opts=label_not_show_opts, is_symbol_show=False, linestyle_opts=opts.LineStyleOpts(opacity=0.8, width=1.0, color="#39afe6")) chart_macd = chart_macd.overlap(line) grid0_opts = opts.GridOpts(pos_left="0%", pos_right="1%", pos_top="12%", height="58%") grid1_opts = opts.GridOpts(pos_left="0%", pos_right="1%", pos_top="74%", height="8%") grid2_opts = opts.GridOpts(pos_left="0%", pos_right="1%", pos_top="86%", height="10%") grid_chart = Grid(init_opts) grid_chart.add(chart_k, grid_opts=grid0_opts) grid_chart.add(chart_vol, grid_opts=grid1_opts) grid_chart.add(chart_macd, grid_opts=grid2_opts) return grid_chart
def line_step() -> Line: c = (Line().add_xaxis(Faker.choose()).add_yaxis( "商家A", Faker.values(), is_step=True).set_global_opts( title_opts=opts.TitleOpts(title="Line-阶梯图"))) return c
def line_base() -> Line: c = (Line().add_xaxis(Faker.choose()).add_yaxis( "商家A", Faker.values()).add_yaxis("商家B", Faker.values()).set_global_opts( title_opts=opts.TitleOpts(title="Line-基本示例"))) return c
def draw_chart(stock_data): ''' pyecharts V1 版本开始支持链式调用 文档地址 https://pyecharts.org/#/zh-cn/ ''' 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
(Line().add_xaxis(xaxis_data=x_data).add_yaxis( series_name="QPS", # stack="总量", y_axis=[0, 6512.09, 11408.77, 17198.11, 21451.15, 26426.46, 25311.42], areastyle_opts=opts.AreaStyleOpts(opacity=0.5), label_opts=opts.LabelOpts(is_show=True), ).add_yaxis( series_name="请求总量", # stack="总量", y_axis=[0, 3908017, 6845695, 10320806, 12871444, 15867653, 15188519], areastyle_opts=opts.AreaStyleOpts(opacity=0.5), label_opts=opts.LabelOpts(is_show=True), ).add_yaxis( series_name="TPS", # stack="总量", y_axis=[0, 6512.09, 11408.77, 17198.11, 21451.15, 26426.46, 25311.42], areastyle_opts=opts.AreaStyleOpts(opacity=0.5), label_opts=opts.LabelOpts(is_show=True), ).add_yaxis( series_name="事物总量", # stack="总量", y_axis=[0, 3908017, 6845695, 10320806, 12871444, 15867653, 15188519], areastyle_opts=opts.AreaStyleOpts(opacity=0.5), label_opts=opts.LabelOpts(is_show=True), ).set_global_opts( title_opts=opts.TitleOpts(title="oltp_point_select-索引查询"), tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"), yaxis_opts=opts.AxisOpts( type_="value", axistick_opts=opts.AxisTickOpts(is_show=False), splitline_opts=opts.SplitLineOpts(is_show=False), ), xaxis_opts=opts.AxisOpts(type_="category", boundary_gap=False), ).render("oltp_point_select.html"))
) .set_global_opts(legend_opts=opts.LegendOpts(pos_left="legft", orient="vertical")) .set_series_opts( tooltip_opts=opts.TooltipOpts( trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)" ), label_opts=opts.LabelOpts(formatter="{b}: {c}") ) ) pie.render_notebook() # 折线图 line = ( Line() .add_xaxis(x) .add_yaxis('china', data_china) .set_global_opts(title_opts=opts.TitleOpts(title="Line - 基本示例")) ) line.render_notebook() line = ( Line() .add_xaxis(x) .add_yaxis('china', data_china) .add_yaxis('russis', data_russia) .set_global_opts(title_opts=opts.TitleOpts(title="Line - 双折线图")) ) line.render_notebook()
Line() .add_xaxis(xaxis_data=x_data) .add_yaxis( series_name="邮件营销", stack="总量", y_axis=[120, 132, 101, 134, 90, 230, 210], label_opts=opts.LabelOpts(is_show=False), ) .add_yaxis( series_name="联盟广告", stack="总量", y_axis=[220, 182, 191, 234, 290, 330, 310], label_opts=opts.LabelOpts(is_show=False), ) .add_yaxis( series_name="视频广告", stack="总量", y_axis=[150, 232, 201, 154, 190, 330, 410], label_opts=opts.LabelOpts(is_show=False), ) .add_yaxis( series_name="直接访问", stack="总量", y_axis=[320, 332, 301, 334, 390, 330, 320], label_opts=opts.LabelOpts(is_show=False), ) .add_yaxis( series_name="搜索引擎", stack="总量", y_axis=[820, 932, 901, 934, 1290, 1330, 1320], label_opts=opts.LabelOpts(is_show=False), ) .set_global_opts( title_opts=opts.TitleOpts(title="折线图堆叠"), tooltip_opts=opts.TooltipOpts(trigger="axis"), yaxis_opts=opts.AxisOpts( type_="value", axistick_opts=opts.AxisTickOpts(is_show=True), splitline_opts=opts.SplitLineOpts(is_show=True), ), xaxis_opts=opts.AxisOpts(type_="category", boundary_gap=False), ) .render("stacked_line_chart.html")
min_=0, max_=250, position="right", offset=80, axisline_opts=opts.AxisLineOpts( linestyle_opts=opts.LineStyleOpts(color="#5793f3") ), axislabel_opts=opts.LabelOpts(formatter="{value} ml"), ), title_opts=opts.TitleOpts(title="Grid-多 Y 轴示例"), tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"), ) ) line = ( Line() .add_xaxis(x_data) .add_yaxis( "平均温度", [2.0, 2.2, 3.3, 4.5, 6.3, 10.2, 20.3, 23.4, 23.0, 16.5, 12.0, 6.2], yaxis_index=2, color="#675bba", label_opts=opts.LabelOpts(is_show=False), ) ) bar.overlap(line) grid = Grid() grid.add(bar, opts.GridOpts(pos_left="5%", pos_right="20%"), is_control_axis_index=True) grid.render("grid_multi_yaxis.html")
[(0, 730), (1, 1471), (2, 1768), (3, 3914), (4, 5929), (5, 15821), (6, 34954), (7, 76019), (8, 69751), (9, 21495), (10, 2288)], sort_="ascending", label_opts=opts.LabelOpts(position="inside"), ).set_global_opts(title_opts=opts.TitleOpts(title="用户等级分布"))) # 歌单数和粉丝数的关系 d = (Scatter().add_xaxis([i for i in range(0, 13)]).add_yaxis( "粉丝数", [j for j in range(100, 1300, 100)]).set_global_opts( title_opts=opts.TitleOpts(title="歌单数和粉丝数关系"))) # 男女粉丝的粉丝数TOP10 ee = (Line().add_xaxis([ str(i) for i in range(1, 11) ]).add_yaxis("男性", [ 2331948, 436372, 328108, 254534, 146967, 78094, 76079, 67013, 65588, 63676 ]).add_yaxis( "女性", [273930, 207547, 138289, 132198, 88809, 47306, 39272, 36877, 35043, 34579 ]).set_global_opts(title_opts=opts.TitleOpts(title="男女粉丝的粉丝数TOP20"))) e = (Line().add_xaxis( [i for i in range(1, 9)]).add_yaxis("A", Faker.values()).add_yaxis( "B", Faker.values()).set_global_opts(title_opts=opts.TitleOpts(title="测试"))) # e.render('mycharts.html') # ee.render('test.html') # make_snapshot(snapshot, pie.render(), "pie.png") pemysql.gender(5771) pemysql.level(5771)
def to_grid(ka, kline_mode: str = "new", with_bi: bool = False, with_xd: bool = False, with_zs: bool = False, with_bs: bool = False, with_ma: bool = False, with_vol: bool = False, with_macd: bool = False, title: str = "ChanLun In Practise", width: str = "1440px", height: str = '900px') -> Grid: """绘制缠中说禅K线分析结果 :param kline: K线 new / raw,new标识标准化后的k线,raw标识原始k线 :param with_bi: 是否显示笔识别结果,默认True,不输出False :param with_xd: 是否显示线段识别结果 :param with_zs: 是否显示中枢识别结果 :param with_bs: 是否显示买卖点 :param with_ma: 是否显示均线,默认True,不输出False :param with_macd: 是否显示macd,默认True,不输出False :param with_vol: 是否显示成交量,默认True,不输出False :param title: 图表标题 :param width: 图表宽度 :param height: 图表高度 :return: 用Grid组合好的图表 """ # 配置项设置 # ------------------------------------------------------------------------------------------------------------------ bg_color = "#1f212d" # 背景 up_color = "#F9293E" down_color = "#00aa3b" init_opts = opts.InitOpts(bg_color=bg_color, width='1400px', height='800px') title_opts = opts.TitleOpts(title=title, pos_top="1%", title_textstyle_opts=opts.TextStyleOpts(color=up_color, font_size=20), subtitle_textstyle_opts=opts.TextStyleOpts(color=down_color, font_size=12)) label_not_show_opts = opts.LabelOpts(is_show=False) legend_not_show_opts = opts.LegendOpts(is_show=False) red_item_style = opts.ItemStyleOpts(color=up_color) green_item_style = opts.ItemStyleOpts(color=down_color) k_style_opts = opts.ItemStyleOpts(color=up_color, color0=down_color, border_color=up_color, border_color0=down_color, opacity=0.8) legend_opts = opts.LegendOpts(is_show=True, pos_top="1%", pos_left="30%", item_width=14, item_height=8, textstyle_opts=opts.TextStyleOpts(font_size=12, color="#0e99e2")) brush_opts = opts.BrushOpts(tool_box=["rect", "polygon", "keep", "clear"], x_axis_index="all", brush_link="all", out_of_brush={"colorAlpha": 0.1}, brush_type="lineX") axis_pointer_opts = opts.AxisPointerOpts(is_show=True, link=[{"xAxisIndex": "all"}]) dz_inside = opts.DataZoomOpts(False, "inside", xaxis_index=[0, 1, 2]) dz_slider = opts.DataZoomOpts(True, "slider", xaxis_index=[0, 1, 2], pos_top="96%", pos_bottom="0%") yaxis_opts = opts.AxisOpts(is_scale=True, axislabel_opts=opts.LabelOpts(color="#c7c7c7", font_size=8, position="inside")) grid0_xaxis_opts = opts.AxisOpts(type_="category", grid_index=0, axislabel_opts=label_not_show_opts, split_number=20, min_="dataMin", max_="dataMax", is_scale=True, boundary_gap=False, axisline_opts=opts.AxisLineOpts(is_on_zero=False)) tool_tip_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"), ) # 数据预处理 # ------------------------------------------------------------------------------------------------------------------ kline = ka.kline_new if kline_mode == 'new' else ka.kline_raw dts = [x['dt'] for x in kline] k_data = [[x['open'], x['close'], x['low'], x['high']] for x in kline] # seriesname aggregation = len(ka.ka_list)>0 # {'freq': {'kline', 'ma', 'vol', 'macd'}} agg_dict = {} agg_dict[ka.freq] = { "kline": k_data, "ma": ka.ma, "vol": kline, "macd": ka.macd } if aggregation: for high_ka in ka.ka_list: agg_dict[high_ka.freq] = {} _high_k_data = high_ka.kline_new if kline_mode == 'new' else high_ka.kline_raw high_k_data = [] high_ma_data = [] high_vol_data = [] high_macd_data = [] for i in range(len(dts)): high_k_data.append([]) high_ma_data.append({}) high_vol_data.append(None) high_macd_data.append(None) for ki in range(len(kline)): k = kline[ki] _start = 0 for h_ki in range(_start, len(_high_k_data)): h_k = _high_k_data[h_ki] if (h_k['dt'] == k['dt']): high_k_data[ki] = [h_k['open'], h_k['close'], h_k['low'], h_k['high']] high_ma_data[ki] = high_ka.ma[h_ki] high_vol_data[ki] = h_k high_macd_data[ki] = high_ka.macd[h_ki] _start = h_ki+1 break agg_dict[high_ka.freq] = { "kline": high_k_data, "ma": high_ma_data, "vol": high_vol_data, "macd": high_macd_data } # K 线主图 # ------------------------------------------------------------------------------------------------------------------ chart_k = Kline() chart_k.add_xaxis(xaxis_data=dts) for k, v in agg_dict.items(): chart_k.add_yaxis(series_name=k if aggregation else 'kline', y_axis=v['kline'], itemstyle_opts=k_style_opts) is_selected = False chart_k.set_global_opts( legend_opts=legend_opts, datazoom_opts=[dz_inside, dz_slider], yaxis_opts=yaxis_opts, tooltip_opts=tool_tip_opts, axispointer_opts=axis_pointer_opts, brush_opts=brush_opts, title_opts=title_opts, xaxis_opts=grid0_xaxis_opts, ) if with_ma: # 均线图 # ------------------------------------------------------------------------------------------------------------------ ma_keys = [x for x in agg_dict[ka.freq]['ma'][0].keys() if "ma" in x][:3] ma_colors = ["#39afe6", "#da6ee8", "#00940b"] chart_ma = Line() chart_ma.add_xaxis(xaxis_data=dts) for key, vals in agg_dict.items(): for i, k in enumerate(ma_keys): y_data = [x[k] if k in x else None for x in v['ma']] chart_ma.add_yaxis(series_name=key if aggregation else k.upper(), y_axis=y_data, is_smooth=True, is_selected=True, is_connect_nones=True, symbol_size=0, label_opts=label_not_show_opts, linestyle_opts=opts.LineStyleOpts(opacity=0.8, width=1.0, color=ma_colors[i])) chart_ma.set_global_opts(xaxis_opts=grid0_xaxis_opts, legend_opts=legend_not_show_opts) chart_k = chart_k.overlap(chart_ma) # 缠论结果 # ------------------------------------------------------------------------------------------------------------------ def __draw_bi_line(_ka): bi_dts = [x['dt'] for x in _ka.bi_list] bi_val = [x['bi'] for x in _ka.bi_list] chart_bi = Line() chart_bi.add_xaxis(bi_dts) chart_bi.add_yaxis(series_name=_ka.freq if aggregation else "BI", y_axis=bi_val, is_selected=True, symbol="diamond", symbol_size=10, label_opts=label_not_show_opts,) chart_bi.set_global_opts(xaxis_opts=grid0_xaxis_opts, legend_opts=legend_not_show_opts) return chart_bi if with_bi: chark_k = chart_k.overlap(__draw_bi_line(ka)) for _ka in ka.ka_list: chark_k = chart_k.overlap(__draw_bi_line(_ka)) def __draw_xd_line(_ka): xd_dts = [x['dt'] for x in _ka.xd_list] xd_val = [x['xd'] for x in _ka.xd_list] chart_xd = Line() chart_xd.add_xaxis(xd_dts) chart_xd.add_yaxis(series_name=_ka.freq if aggregation else "XD", y_axis=xd_val, is_selected=True, symbol="triangle", symbol_size=10,) chart_xd.set_global_opts(xaxis_opts=grid0_xaxis_opts, legend_opts=legend_not_show_opts) return chart_xd if with_xd: chark_k = chart_k.overlap(__draw_xd_line(ka)) for _ka in ka.ka_list: chark_k = chart_k.overlap(__draw_xd_line(_ka)) def __draw_zs_area(_ka): lines = [] scatters = [] for _zs in _ka.zs_list: x_start = _zs['start_point']['dt'] if _zs['zs_finished']:# 中枢完成 x_end = _zs['end_point']['dt'] chart_b = EffectScatter() if 'buy3' in _zs: chart_b.add_xaxis([_zs['buy3']['dt']]) chart_b.add_yaxis(series_name=_ka.freq if aggregation else "B", y_axis=[_zs['buy3']['xd']], is_selected=False, symbol="circle", symbol_size=8, itemstyle_opts=opts.ItemStyleOpts(color="red",)) chart_b.set_global_opts(xaxis_opts=grid0_xaxis_opts, legend_opts=legend_not_show_opts) scatters.append(chart_b) elif 'sell3' in _zs: chart_b.add_xaxis([_zs['sell3']['dt']]) chart_b.add_yaxis(series_name=_ka.freq if aggregation else "S", y_axis=[_zs['sell3']['xd']], is_selected=False, symbol="circle", symbol_size=8, itemstyle_opts=opts.ItemStyleOpts(color="green",)) chart_b.set_global_opts(xaxis_opts=grid0_xaxis_opts, legend_opts=legend_not_show_opts) scatters.append(chart_b) elif len(_zs['points'])>=5:# 中枢成立但未完成,有3笔或段以上 x_end = _zs['points'][-1]['dt'] else: # 中枢未完成,且未确定 continue ZD = _zs['ZD'] ZG = _zs['ZG'] area_data=[[ {'xAxis': x_start, 'yAxis': ZD, 'value': ZD }, {'xAxis': x_end, 'yAxis': ZG, 'value': ZG }]] line = (Line() .add_xaxis([x_start, x_end]) .add_yaxis(series_name=_ka.freq if aggregation else "ZS", y_axis=[ZD, ZG], symbol='none' """ , markpoint_opts = opts.MarkPointOpts( data=[ opts.MarkPointItem(type_="max", name="ZG"), opts.MarkPointItem(type_="min", name="ZD"), ] ) """ , markline_opts=opts.MarkLineOpts( label_opts=opts.LabelOpts( position="middle", color="blue", font_size=15, ), linestyle_opts=opts.LineStyleOpts(type_="dashed"), data=area_data, symbol=["none", "none"], ) ) .set_series_opts( markarea_opts=opts.MarkAreaOpts(data=area_data, itemstyle_opts=opts.ItemStyleOpts(color="#dcdcdc",opacity=0.1)) )) lines.append(line) return lines, scatters if with_zs: _areas, _scatters = __draw_zs_area(ka) for _ka in ka.ka_list: _a, _s = __draw_zs_area(_ka) _areas.extend(_a) _scatters.extend(_s) for _area in _areas: chark_k = chart_k.overlap(_area) for _scatter in _scatters: chark_k = chart_k.overlap(_scatter) # if with_vol: # 成交量图 # ------------------------------------------------------------------------------------------------------------------ chart_vol = Bar() chart_vol.add_xaxis(dts) for k, v in agg_dict.items(): vol = [] for row in v['vol']: if not row: row = {'close': 0, 'open': 0, 'vol': 0} item_style = red_item_style if row['close'] > row['open'] else green_item_style bar = opts.BarItem(name=None, value=row['vol'], itemstyle_opts=item_style, label_opts=label_not_show_opts) vol.append(bar) chart_vol.add_yaxis(series_name=k if aggregation else "Volume", y_axis=vol, bar_width='60%') chart_vol.set_global_opts( xaxis_opts=opts.AxisOpts( type_="category", grid_index=1, axislabel_opts=opts.LabelOpts(is_show=True, font_size=8, color="#9b9da9"), ), yaxis_opts=yaxis_opts, legend_opts=legend_not_show_opts, ) #if with_macd: # MACD图 # ------------------------------------------------------------------------------------------------------------------ chart_macd = Bar() chart_macd.add_xaxis(dts) for k, v in agg_dict.items(): macd_bar = [] for row in v['macd']: if not row: row = {'macd': 0} item_style = red_item_style if row['macd'] > 0 else green_item_style bar = opts.BarItem(name=None, value=round(row['macd'], 4), itemstyle_opts=item_style, label_opts=label_not_show_opts) macd_bar.append(bar) chart_macd.add_yaxis(series_name=k if aggregation else "MACD", y_axis=macd_bar, bar_width='60%') chart_macd.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, color="#c7c7c7"), ), legend_opts=opts.LegendOpts(is_show=False), ) line = Line() line.add_xaxis(dts) for k, v in agg_dict.items(): macd = v['macd'] diff = [round(x['diff'], 4) if x else None for x in macd] dea = [round(x['dea'], 4) if x else None for x in macd] line.add_yaxis(series_name=k if aggregation else "DIFF", y_axis=diff, label_opts=label_not_show_opts, is_symbol_show=False , is_connect_nones=True, linestyle_opts=opts.LineStyleOpts(opacity=0.8, width=1.0, color="#EDCB89")) line.add_yaxis(series_name=k if aggregation else "DEA", y_axis=dea, label_opts=label_not_show_opts, is_symbol_show=False , is_connect_nones=True, linestyle_opts=opts.LineStyleOpts(opacity=0.8, width=1.0, color="#FFFFFF")) chart_macd = chart_macd.overlap(line) grid0_opts = opts.GridOpts(pos_left="3%", pos_right="1%", pos_top="12%", height="58%") grid1_opts = opts.GridOpts(pos_left="3%", pos_right="1%", pos_top="74%", height="8%") grid2_opts = opts.GridOpts(pos_left="3%", pos_right="1%", pos_top="86%", height="10%") grid_chart = Grid(init_opts) grid_chart.add(chart_k, grid_opts=grid0_opts) grid_chart.add(chart_vol, grid_opts=grid1_opts) grid_chart.add(chart_macd, grid_opts=grid2_opts) return grid_chart
def _create_line(): return Line().add_xaxis([ 'Sunday', 'Saturday', 'Friday', 'Thursday', 'Wednesday', 'Tuesday', 'Monday' ]).add_yaxis("商家A", [7, 6, 5, 4, 3, 2, 1])
def picture1(self): df = pd.read_sql( f"select * from {self.table_name} where 检查时间 LIKE '%{self.last_month}%'", self.conn) df['time'] = pd.to_datetime(df['检查时间']) df['time'] = df['time'].apply(lambda x: x.strftime('%Y%m%d')) ya = [] for i in df['time'].unique(): i = str(i) try: bkk = df[df['time'] == i]['性质'].value_counts()['A类'] ya.append(str(bkk)) except: bkk = 0 ya.append(str(bkk)) # print(ya, len(ya)) yb = [] for i in df['time'].unique(): i = str(i) try: bkk = df[df['time'] == i]['性质'].value_counts()['B类'] yb.append(str(bkk)) except: bkk = 0 yb.append(str(bkk)) # print(yb, len(yb)) yc = [] for i in df['time'].unique(): i = str(i) try: bkk = df[df['time'] == i]['性质'].value_counts()['C类'] yc.append(str(bkk)) print(yc) except: bkk = 0 yc.append(str(bkk)) print(yc, len(yc)) yd = [] for i in df['time'].unique(): i = str(i) try: bkk = df[df['time'] == i]['性质'].value_counts()['D类'] yd.append(str(bkk)) except: bkk = 0 yd.append(str(bkk)) x = df['time'].unique() # chart = picture(x,ya,yb,yc,yd) a = [] for i in x: a.append(str(i)) c = ( Line(init_opts=opts.InitOpts( page_title=f"现场安全信息性质分布(月)")).add_xaxis(a).add_yaxis( "A类", ya).add_yaxis("B类", yb).add_yaxis("C类", yc). add_yaxis("D类", yd).set_global_opts( title_opts=opts.TitleOpts(title=f"现场安全信息性质分布(月)", subtitle=f"统计时间:{self.last_month}"), tooltip_opts=opts.TooltipOpts(trigger="axis"), xaxis_opts=opts.AxisOpts( axislabel_opts=opts.LabelOpts(rotate=45), name="日期"), # toolbox_opts=opts.ToolBoxFeatureSaveAsImageOpts(background_color= "auto",type_='jpg'), toolbox_opts=opts.ToolboxOpts(is_show=True, feature={ "saveAsImage": { 'backgroundColor': 'white' }, "dataZoom": {}, "restore": {}, "magicType": { "show": True, "type": ["line", "bar"] }, "dataView": {} }), )) print('已画图成功') return c
def draw_line_with_two_y(xaxis_data, y1_series_name, y1_axis, y2_series_name, y2_axis, y3_series_name, y3_axis, y1_name, y2_name, to_file, unit, svg_name): """ 左边是 两条线; 右边是 一条线。 :param svg_name: svg文件 :param xaxis_data: 横轴 :param y1_series_name: 左边第一条线的系列名 :param y1_axis: 左边第一条线的数值 :param y2_series_name: 左边第二条线的系列名 :param y2_axis: 左边第二条线的数值 :param y3_series_name: 右边第一条线的系列名 :param y3_axis: 右边第一条线的数值 :param y1_name: 左边的纵轴名称 :param y2_name: 右边的纵轴名称 :param to_file: 结果文件 :param unit: 横轴的数值的单位(加在每个横轴值后面,比如 月) :return: """ xaxis_data = [str(i) + unit for i in xaxis_data] bar = Line(init_opts=opts.InitOpts( width="800px", height="600px", bg_color='white' )).add_xaxis( xaxis_data=xaxis_data, # add_xaxis=opts.LabelOpts(formatter="{value}" + unit), ).add_yaxis( series_name=y1_series_name, is_smooth=True, symbol="circle", symbol_size=8, is_symbol_show=True, # color="#d14a61", y_axis=y1_axis, yaxis_index=0, label_opts=opts.LabelOpts(is_show=False), linestyle_opts=opts.LineStyleOpts(width=2), ).add_yaxis( series_name=y2_series_name, is_smooth=True, symbol="circle", symbol_size=8, is_symbol_show=True, # color="#d14a61", y_axis=y2_axis, yaxis_index=0, label_opts=opts.LabelOpts(is_show=False), linestyle_opts=opts.LineStyleOpts(width=2), ).add_yaxis( series_name=y3_series_name, is_smooth=True, symbol="circle", symbol_size=8, is_symbol_show=True, # color="#d14a61", y_axis=y3_axis, yaxis_index=1, label_opts=opts.LabelOpts(is_show=False), linestyle_opts=opts.LineStyleOpts(width=2), ).extend_axis(yaxis=opts.AxisOpts( type_="value", name=y2_name, # min_=0, # max_=25, position="right", axisline_opts=opts.AxisLineOpts(linestyle_opts=opts.LineStyleOpts()), axislabel_opts=opts.LabelOpts(formatter="{value}", font_size=15), splitline_opts=opts.SplitLineOpts( is_show=True, linestyle_opts=opts.LineStyleOpts(opacity=1)), name_textstyle_opts=opts.TextStyleOpts(font_size=15))).set_global_opts( yaxis_opts=opts.AxisOpts( type_="value", name=y1_name, # min_=0, # max_=250, position="left", offset=0, axisline_opts=opts.AxisLineOpts( linestyle_opts=opts.LineStyleOpts()), axislabel_opts=opts.LabelOpts(formatter="{value}", font_size=15), name_textstyle_opts=opts.TextStyleOpts(font_size=15)), xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts( formatter="{value}", font_size=15), ), tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"), toolbox_opts=opts.ToolboxOpts(feature=opts.ToolBoxFeatureOpts( data_zoom=opts.ToolBoxFeatureDataZoomOpts(is_show=False), # brush=opts.ToolBoxFeatureBrushOpts(is_show=False), )), legend_opts=opts.LegendOpts( item_width=25, item_height=10, textstyle_opts=opts.TextStyleOpts(font_size=15)), ) make_snapshot(snapshot, bar.render(to_file), svg_name) # 生成svg图片
def Line_ele(name, model_names, datas, y_name, y_max): x = [n for n in range(len(datas[0]))] line = Line(init_opts=opts.InitOpts(bg_color='rgba(255,250,205,0.2)', width='1500px', height='600px', page_title=name)) line.add_xaxis(xaxis_data=x) average = [] for i in range(len(datas)): sum = 0 num = 0 y = [n[0] for n in datas[i]] line.add_yaxis(series_name=model_names[i], y_axis=y, symbol="arrow", is_symbol_show=False) for j in datas[i]: sum += j[0] num = num + 1 if j[0] > 0 else num average.append(sum / num) print(sum, num, average[i]) line.set_series_opts( label_opts=opts.LabelOpts(is_show=False), markpoint_opts=opts.MarkPointOpts(data=[ opts.MarkPointItem(type_="min", name="最小值"), opts.MarkPointItem(type_="max", name="最大值"), ]), markline_opts=opts.MarkLineOpts(data=[ opts.MarkLineItem(name="multi", y=average[0]), opts.MarkLineItem(name="multis", y=average[1]), opts.MarkLineItem(name="plans", y=average[2]) ]), ) line.set_global_opts( title_opts=opts.TitleOpts(title=name), xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=30), name='TEST_PICS'), yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=30), name=y_name, min_=0, max_=y_max), legend_opts=opts.LegendOpts(textstyle_opts=opts.TextStyleOpts( font_size=30))) util.mkdir('./analysis') line.render('./analysis/' + name + '.html')
def draw_line_picture(xaxis_data, data, to_file, unit, svg_name, stack, y_name): """ 多条线,是否堆叠要确认下 :param label_right: :param y_name: y轴名称 :param stack: boolean, 是否要堆叠 :param xaxis_data: x轴 :param data: {series_name, data} :param svg_name: svg文件 :param to_file: 结果文件 :param unit: 横轴的数值的单位(加在每个横轴值后面,比如 月) :return: """ xaxis_data = [str(i) + unit for i in xaxis_data] bar = Line(init_opts=opts.InitOpts( width="800px", height="600px", bg_color='white')).add_xaxis( xaxis_data=xaxis_data, # add_xaxis=opts.LabelOpts(formatter="{value}" + unit), ) for series_name, y_axis in data.items(): if stack: bar = bar.add_yaxis( series_name=series_name, is_smooth=True, symbol="circle", # symbol_size=8, stack='1', is_symbol_show=False, # color="#d14a61", y_axis=y_axis, yaxis_index=0, label_opts=opts.LabelOpts(is_show=False), # linestyle_opts=opts.LineStyleOpts(width=2), areastyle_opts=opts.AreaStyleOpts(opacity=1)) else: bar = bar.add_yaxis( series_name=series_name, is_smooth=True, symbol="circle", symbol_size=8, is_symbol_show=True, # color="#d14a61", y_axis=y_axis, yaxis_index=0, label_opts=opts.LabelOpts(is_show=False), linestyle_opts=opts.LineStyleOpts(width=2), ) bar = bar.set_global_opts( yaxis_opts=opts.AxisOpts( type_="value", name=y_name, name_textstyle_opts=opts.TextStyleOpts(font_size=25), # min_=0, # max_=250, position="left", offset=0, axisline_opts=opts.AxisLineOpts( linestyle_opts=opts.LineStyleOpts()), axislabel_opts=opts.LabelOpts(formatter="{value}", font_size=25), ), xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts( formatter="{value}", font_size=25, interval=0), ), tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"), toolbox_opts=opts.ToolboxOpts(feature=opts.ToolBoxFeatureOpts( data_zoom=opts.ToolBoxFeatureDataZoomOpts(is_show=False), # brush=opts.ToolBoxFeatureBrushOpts(is_show=False), )), legend_opts=opts.LegendOpts( pos_left="12%", pos_top="10%", orient="vertical", # backgroundColor='rgb(255, 255, 255)', item_width=40, item_height=20, textstyle_opts=opts.TextStyleOpts(font_size=25)), ) make_snapshot(snapshot, bar.render(to_file), svg_name) # 生成svg图片
def line_smooth() -> Line: c = (Line().add_xaxis(b).add_yaxis( "住宅", [ len(z4), len(z6), len(z8), len(z10), len(z12), len(z14), len(z16), len(z18), len(z20), len(z22), len(z24), len(z26), len(z28), len(z30), len(z40) ], is_smooth=True).add_yaxis( "商业", [ len(s4), len(s6), len(s8), len(s10), len(s12), len(s14), len(s16), len(s18), len(s20), len(s22), len(s24), len(s26), len(s28), len(s30), len(s40) ], is_smooth=True).add_yaxis( "写字楼", [ len(x4), len(x6), len(x8), len(x10), len(x12), len(x14), len(x16), len(x18), len(x20), len(x22), len(x24), len(x26), len(x28), len(x30), len(x40) ], is_smooth=True).add_yaxis( "别墅", [ len(b4), len(b6), len(b8), len(b10), len(b12), len(b14), len(b16), len(b18), len(b20), len(b22), len(b24), len(b26), len(b28), len(b30), len(b40) ], is_smooth=True).set_global_opts(title_opts=opts.TitleOpts( title="各区域各区间房价房源数量"))) return c
def draw_line_picture_right_legend(xaxis_data, data, to_file, unit, svg_name, stack, y_name, pos_right, width='800px'): """ 多条线,是否堆叠要确认下 :param width: :param pos_right: :param y_name: y轴名称 :param stack: boolean, 是否要堆叠 :param xaxis_data: x轴 :param data: {series_name, data} :param svg_name: svg文件 :param to_file: 结果文件 :param unit: 横轴的数值的单位(加在每个横轴值后面,比如 月) :return: """ xaxis_data = [str(i) + unit for i in xaxis_data] bar = Line(init_opts=opts.InitOpts( width="800px", height="600px", bg_color='white')).add_xaxis( xaxis_data=xaxis_data, # add_xaxis=opts.LabelOpts(formatter="{value}" + unit), ) for series_name, y_axis in data.items(): if stack: bar = bar.add_yaxis( series_name=series_name, is_smooth=True, symbol="circle", # symbol_size=8, stack='1', is_symbol_show=False, # color="#d14a61", y_axis=y_axis, yaxis_index=0, label_opts=opts.LabelOpts(is_show=False), # linestyle_opts=opts.LineStyleOpts(width=2), areastyle_opts=opts.AreaStyleOpts(opacity=1)) else: bar = bar.add_yaxis( series_name=series_name, is_smooth=True, symbol="circle", symbol_size=8, is_symbol_show=True, # color="#d14a61", y_axis=y_axis, yaxis_index=0, label_opts=opts.LabelOpts(is_show=False), linestyle_opts=opts.LineStyleOpts(width=2), ) bar = bar.set_global_opts( yaxis_opts=opts.AxisOpts( type_="value", name=y_name, # min_=0, # max_=250, position="left", offset=0, axisline_opts=opts.AxisLineOpts( linestyle_opts=opts.LineStyleOpts()), axislabel_opts=opts.LabelOpts(formatter="{value}"), ), tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"), # toolbox_opts=opts.ToolboxOpts( # feature=opts.ToolBoxFeatureOpts( # data_zoom=opts.ToolBoxFeatureDataZoomOpts(is_show=False), # # brush=opts.ToolBoxFeatureBrushOpts(is_show=False), # ) # ), legend_opts=opts.LegendOpts(pos_right='10%', pos_top="2%", orient="vertical"), ) grid = (Grid(init_opts=opts.InitOpts( width=width, height="600px", bg_color='rgb(255, 255, 255)')).add( bar, grid_opts=opts.GridOpts(pos_right=pos_right), is_control_axis_index=True)) grid.render(to_file) to_svg(to_file, svg_name)
category_gap='30%') blue_bar.set_global_opts( title_opts=opts.TitleOpts(title='大乐透彩票', subtitle='开奖至今数据'), # toolbox_opts=opts.ToolboxOpts(), # datazoom_opts=opts.DataZoomOpts(), yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts( formatter="{value}/次")), xaxis_opts=opts.AxisOpts(name='开奖号码', axislabel_opts=opts.LabelOpts(rotate=-90))) blue_bar.set_series_opts(markpoint_opts=opts.MarkPointOpts(data=[ opts.MarkPointItem(type_='max', name='最大值'), opts.MarkPointItem(type_='min', name='最小值') ])) blue_line = Line(init_opts=opts.InitOpts(width="1800px", height="800px")) blue_line.set_global_opts( title_opts=opts.TitleOpts(title="篮球"), toolbox_opts=opts.ToolboxOpts(is_show=True), datazoom_opts=opts.DataZoomOpts(), xaxis_opts=opts.AxisOpts(type_="category", boundary_gap=False, name="开奖期数", axislabel_opts=opts.LabelOpts(rotate=-90)), ) blue_line.add_xaxis(xaxis_data=blue_num) blue_line.add_yaxis( series_name="篮球号码", y_axis=blue_balls, symbol="emptyCircle", is_symbol_show=True,
import pyecharts.options as opts from pyecharts.charts import Line """ Gallery 使用 pyecharts 1.1.0 参考地址: https://echarts.baidu.com/examples/editor.html?c=line-simple 目前无法实现的功能: 暂无 """ x_data = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] y_data = [820, 932, 901, 934, 1290, 1330, 1320] (Line().set_global_opts( tooltip_opts=opts.TooltipOpts(is_show=False), xaxis_opts=opts.AxisOpts(type_="category"), yaxis_opts=opts.AxisOpts( type_="value", axistick_opts=opts.AxisTickOpts(is_show=True), splitline_opts=opts.SplitLineOpts(is_show=True), ), ).add_xaxis(xaxis_data=x_data).add_yaxis( series_name="", y_axis=y_data, symbol="emptyCircle", is_symbol_show=True, label_opts=opts.LabelOpts(is_show=False), ).render("render/basic_line_chart.html"))