pol_den = confirm_detail.sort_values(by="density", ascending=False) x_data = pol_den["Region_CN"].tolist() y_data = pol_den["四月"].tolist() x_data.pop() x_data.pop() y_data.pop() y_data.pop() polDensity_line = (Line(init_opts=opts.InitOpts( width='95vw', height='95vh', )).set_global_opts( tooltip_opts=opts.TooltipOpts(is_show=False), title_opts=opts.TitleOpts(title="人口密度——确诊人数折线图"), xaxis_opts=opts.AxisOpts(type_="category", name="人/km²(大~小)", axislabel_opts={"rotate": 45}), yaxis_opts=opts.AxisOpts( type_="value", name="确诊人数", 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=True), ).render("visual_render/basic_line_chart1.html"))
def vtradecost(self, cftable, unitcost=False, start=None, end=yesterdayobj(), rendered=True): """ visualization giving the average cost line together with netvalue line as well as buy and sell points :returns: pyecharts.line """ funddata = [] costdata = [] cashdata = [] #kahar add in order to observe the sum of the cash funddata_test = [] pprice = self.price[self.price["date"] <= end] pcftable = cftable if start is not None: pprice = pprice[pprice["date"] >= start] pcftable = pcftable[pcftable["date"] >= start] for _, row in pprice.iterrows(): date = row["date"] funddata.append(row["netvalue"]) funddata_test.append(3.2) if unitcost: cost = 0 cash = 0 if (date - self.cftable.iloc[0].date).days >= 0: cost = self.unitcost(date) cash = self.get_datecashvalue(date) costdata.append(cost) cashdata.append(cash / 1000000.0) coords = [] # pcftable = pcftable[abs(pcftable["cash"]) > threhold] for i, r in pcftable.iterrows(): coords.append( [r.date, pprice[pprice["date"] <= r.date].iloc[-1]["netvalue"]]) upper = pcftable.cash.abs().max() lower = pcftable.cash.abs().min() if upper == lower: upper = 2 * lower + 1 # avoid zero in denominator def marker_factory(x, y): buy = pcftable[pcftable["date"] <= x].iloc[-1]["cash"] if buy < 0: color = "#ff7733" else: color = "#3366ff" size = (abs(buy) - lower) / (upper - lower) * 5 + 5 return opts.MarkPointItem( coord=[x.date(), y], itemstyle_opts=opts.ItemStyleOpts(color=color), # this nested itemstyle_opts within MarkPointItem is only supported for pyechart>1.7.1 symbol="circle", symbol_size=size, ) line = Line() line.add_xaxis([d.date() for d in pprice.date]) print("costdata", costdata) if unitcost: line.add_yaxis( series_name="持仓成本", y_axis=costdata, is_symbol_show=False, ) line.add_yaxis( series_name="持仓总额k6", y_axis=cashdata, is_symbol_show=False, ) line.add_yaxis( series_name="基金净值", y_axis=funddata, is_symbol_show=False, markpoint_opts=opts.MarkPointOpts( data=[marker_factory(*c) for c in coords], ), ) line.set_global_opts( datazoom_opts=[ opts.DataZoomOpts(is_show=True, type_="slider", range_start=50, range_end=100), opts.DataZoomOpts( is_show=True, type_="slider", orient="vertical", range_start=50, range_end=100, ), ], tooltip_opts=opts.TooltipOpts( is_show=True, trigger="axis", trigger_on="mousemove", axis_pointer_type="cross", ), ) if rendered: return line.render_notebook() else: return line
暂无 """ ( Line(init_opts=opts.InitOpts(width="1280px", height="720px")) .add_xaxis(xaxis_data=["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]) .add_yaxis( series_name="", y_axis=[120, 200, 150, 80, 70, 110, 130], symbol="triangle", symbol_size=20, linestyle_opts=opts.LineStyleOpts(color="green", width=4, type_="dashed"), label_opts=opts.LabelOpts(is_show=False), itemstyle_opts=opts.ItemStyleOpts( border_width=3, border_color="yellow", color="blue" ), ) .set_global_opts( 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), ), tooltip_opts=opts.TooltipOpts(is_show=False), ) .render("line_style_and_item_style.html") )
data = df.loc[df['City'] == 'Delhi', ['Date', 'AQI']] list1 = [] for date in data['Date']: year = date.split('-')[0] list1.append(year) data['year'] = list1 year_message = data.groupby(['year']) year_com = year_message['AQI'].agg(['mean']) year_com.reset_index(inplace=True) year_com_last = year_com.sort_index() x = [e for e in year_com_last['year']] y = [int(e) for e in year_com_last['mean']] line = Line() line.add_xaxis(x) line.add_yaxis('Delhi', y) line.set_series_opts( markpoint_opts=opts.MarkPointOpts(data=[ opts.MarkPointItem(type_='max', name='最大值'), opts.MarkPointItem(type_='min', name='最小值'), ]), label_opts=opts.LabelOpts(is_show=False), ) line.set_global_opts(title_opts=opts.TitleOpts( title='2015-2020印度德里AQI年均走势图', pos_left='center', ),
def bar_difficult() -> Bar: f = open('difficulty_test3.json', encoding='gbk') res = f.read() data = json.loads(res) simple = [0 for i in range(8)] medium = [0 for i in range(8)] hard = [0 for i in range(8)] total = [0 for i in range(8)] nums = [0 for i in range(8)] level_distributed = {"0-10": 0, "11-20": 0, "21-30": 0, "31-40": 0, "41-50": 0, "51-60": 0, "61-70": 0, "71-80": 0, "81-90": 0, "91-100": 0} # 观察难度情况 for val in data.values(): if val["final_level"] <= 10: level_distributed["0-10"] += 1 elif 10 < val["final_level"] <= 20: level_distributed["11-20"] += 1 elif 20 < val["final_level"] <= 30: level_distributed["21-30"] += 1 elif 30 < val["final_level"] <= 40: level_distributed["31-40"] += 1 elif 40 < val["final_level"] <= 50: level_distributed["41-50"] += 1 elif 50 < val["final_level"] <= 60: level_distributed["51-60"] += 1 elif 60 < val["final_level"] <= 70: level_distributed["61-70"] += 1 elif 70 < val["final_level"] <= 80: level_distributed["71-80"] += 1 elif 80 < val["final_level"] <= 90: level_distributed["81-90"] += 1 else: level_distributed["91-100"] += 1 print(level_distributed) # 对数据进行分类 for val in data.values(): if val["case_type"] == "字符串": nums[0] += 1 total[0] += val["final_level"] if val["final_level"] <= 30: simple[0] += 1 elif val["final_level"] > 60: hard[0] += 1 else: medium[0] += 1 elif val["case_type"] == "线性表": nums[1] += 1 total[1] += val["final_level"] if val["final_level"] <= 30: simple[1] += 1 elif val["final_level"] > 60: hard[1] += 1 else: medium[1] += 1 elif val["case_type"] == "数组": nums[2] += 1 total[2] += val["final_level"] if val["final_level"] <= 30: simple[2] += 1 elif val["final_level"] > 60: hard[2] += 1 else: medium[2] += 1 elif val["case_type"] == "查找算法": nums[3] += 1 total[3] += val["final_level"] if val["final_level"] <= 30: simple[3] += 1 elif val["final_level"] > 60: hard[3] += 1 else: medium[3] += 1 elif val["case_type"] == "排序算法": nums[4] += 1 total[4] += val["final_level"] if val["final_level"] <= 30: simple[4] += 1 elif val["final_level"] > 60: hard[4] += 1 else: medium[4] += 1 elif val["case_type"] == "数字操作": nums[5] += 1 total[5] += val["final_level"] if val["final_level"] <= 30: simple[5] += 1 elif val["final_level"] > 60: hard[5] += 1 else: medium[5] += 1 elif val["case_type"] == "图结构": nums[6] += 1 total[6] += val["final_level"] if val["final_level"] <= 30: simple[6] += 1 elif val["final_level"] > 60: hard[6] += 1 else: medium[6] += 1 else: nums[7] += 1 total[7] += val["final_level"] if val["final_level"] <= 30: simple[7] += 1 elif val["final_level"] > 60: hard[7] += 1 else: medium[7] += 1 list1 = [{"value": hard[i], "percent": hard[i] / nums[i]} for i in range(8)] list2 = [{"value": medium[i], "percent": medium[i] / nums[i]} for i in range(8)] list3 = [{"value": simple[i], "percent": simple[i] / nums[i]} for i in range(8)] average = [round(total[i] / nums[i], 2) for i in range(8)] xaxis = ["字符串", "线性表", "数组", "查找算法", "排序算法", "数字操作", "图结构", "树结构"] bar = ( Bar() .add_xaxis(xaxis) .add_yaxis("困难", list1, stack="stack1", category_gap="50%") .add_yaxis("中等", list2, stack="stack1", category_gap="50%") .add_yaxis("简单", list3, stack="stack1", category_gap="50%") .extend_axis( yaxis=opts.AxisOpts( name="难度评分", type_="value", min_=0, max_=100, interval=10, axislabel_opts=opts.LabelOpts(formatter="{value} 分"), ) ) .set_global_opts( title_opts=opts.TitleOpts(title="不同类别题目难度展示图"), toolbox_opts=opts.ToolboxOpts(), tooltip_opts=opts.TooltipOpts( is_show=True, trigger="axis", axis_pointer_type="cross" ), legend_opts=opts.LegendOpts(is_show=True), # 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} 个"), axistick_opts=opts.AxisTickOpts(is_show=True), splitline_opts=opts.SplitLineOpts(is_show=True), ), ) .set_series_opts( label_opts=opts.LabelOpts( position="right", formatter=JsCode( "function(x){return Number(x.data.percent * 100).toFixed() + '%';}" ), ) ) # .render("diff_type_diff_bar.html") ) line = ( Line() .add_xaxis(xaxis_data=xaxis) .add_yaxis( series_name="平均难度分", yaxis_index=1, y_axis=average, label_opts=opts.LabelOpts(is_show=False), linestyle_opts=opts.LineStyleOpts(color="#f05b72", width=2, opacity=0.8) ) ) return bar.overlap(line)
def daily_issue_plot(daily,cummulative): import pyecharts.options as opts from pyecharts.charts import Bar, Line # color = ["#36648B","tomato"] daily = daily.round(2) cummulative = cummulative.round(2) x_data = daily.index.astype(str).tolist() bar = ( Bar(init_opts=opts.InitOpts(width=fig_width, height=fig_height)) .add_xaxis(xaxis_data=x_data) .add_yaxis( series_name="每日发行数量", yaxis_index=2, yaxis_data=daily['发行数量'].tolist(), label_opts=opts.LabelOpts(is_show=False), ).add_yaxis( series_name="每日发行总额", yaxis_index=3, yaxis_data=daily['发行总额'].tolist(), label_opts=opts.LabelOpts(is_show=False), ) .set_global_opts( tooltip_opts=opts.TooltipOpts( is_show=True, trigger="axis", axis_pointer_type="cross" ), 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}"), axistick_opts=opts.AxisTickOpts(is_show=True), splitline_opts=opts.SplitLineOpts(is_show=True), ), toolbox_opts=opts.ToolboxOpts(is_show=True, feature=opts.ToolBoxFeatureOpts( save_as_image=opts.ToolBoxFeatureSaveAsImageOpts( background_color='white', connected_background_color="white", pixel_ratio=pixel_ratio, name="pic", ), ) ) ) ) line = ( Line(init_opts=opts.InitOpts(width=fig_width, height=fig_height)) .add_xaxis(xaxis_data=x_data) .add_yaxis( series_name="累计发行数量", yaxis_index=0, y_axis=cummulative['累计发行数量'].tolist(), label_opts=opts.LabelOpts(is_show=False), is_smooth=True, is_symbol_show=True, symbol="circle", symbol_size=6, linestyle_opts=opts.LineStyleOpts(width=2), ).add_yaxis( series_name="累计发行总额", yaxis_index=1, is_smooth=True, is_symbol_show=True, symbol="circle", symbol_size=6, linestyle_opts=opts.LineStyleOpts(width=2), y_axis=cummulative['累计发行总额'].tolist(), label_opts=opts.LegendOpts(is_show=False), ) .extend_axis(yaxis=opts.AxisOpts( name= "总额", type_="value", position='right', offset=60, axislabel_opts=opts.LabelOpts(formatter="{value}亿",position="right"), ),).extend_axis( yaxis=opts.AxisOpts( name="数量", type_="value", position="left", offset=0, axislabel_opts=opts.LabelOpts(formatter="{value}"), ) ) .extend_axis( yaxis=opts.AxisOpts( name="总额", type_="value", position="left", offset=60, axislabel_opts=opts.LabelOpts(formatter="{value}亿"), ) ) .set_global_opts( tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"), xaxis_opts=opts.AxisOpts( splitline_opts=opts.SplitLineOpts( is_show=True, linestyle_opts=opts.LineStyleOpts(color="#E8E8E8") ), ), yaxis_opts=opts.AxisOpts( name = "数量", type_="value", position="right", offset=0, axisline_opts=opts.AxisLineOpts( linestyle_opts=opts.LineStyleOpts(width=1) ), splitline_opts=opts.SplitLineOpts( is_show=True, linestyle_opts=opts.LineStyleOpts(color='#E8E8E8') ), ), toolbox_opts=opts.ToolboxOpts(is_show=True, feature=opts.ToolBoxFeatureOpts( save_as_image=opts.ToolBoxFeatureSaveAsImageOpts( background_color='white', connected_background_color="white", pixel_ratio=pixel_ratio, name="pic", ), ) ), ) ) line.overlap(bar) return line
def draw_chart(cls, data): kline = ( Kline().add_xaxis(xaxis_data=data["times"]).add_yaxis( series_name="", y_axis=data["datas"], itemstyle_opts=opts.ItemStyleOpts( color="#ef232a", color0="#14b143", border_color="#ef232a", border_color0="#14b143", ), markpoint_opts=opts.MarkPointOpts(data=[ opts.MarkPointItem(type_="max", name="最大值"), opts.MarkPointItem(type_="min", name="最小值"), ]), markline_opts=opts.MarkLineOpts( label_opts=opts.LabelOpts(position="middle", color="blue", font_size=15), data=cls.split_data_part(data), symbol=["circle", "none"], ), ).set_series_opts(markarea_opts=opts.MarkAreaOpts( is_silent=True, data=cls.split_data_part(data))). set_global_opts( title_opts=opts.TitleOpts(title="K线周期图表", 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)), 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="97%", range_end=100), opts.DataZoomOpts(is_show=False, xaxis_index=[0, 2], range_end=100), opts.DataZoomOpts(is_show=False, xaxis_index=[0, 3], 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=data["times"]) # # EMA10 # .add_yaxis( # series_name="EMA10", # y_axis=data["ema10"], # xaxis_index=2, # yaxis_index=2, # label_opts=opts.LabelOpts(is_show=False), # ) # EMA144 # .add_yaxis( # series_name="EMA144", # y_axis=data["ema144"], # xaxis_index=2, # yaxis_index=2, # label_opts=opts.LabelOpts(is_show=False), # ) # boll_median .add_yaxis( series_name="median", y_axis=data["boll_median"], xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), ) # boll_upper .add_yaxis( series_name="upper", y_axis=data["boll_upper"], xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), ) # boll_lower .add_yaxis( series_name="lower", y_axis=data["boll_lower"], xaxis_index=2, yaxis_index=2, 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["times"]).add_yaxis( series_name="Volumn", yaxis_data=data["vols"], xaxis_index=1, yaxis_index=1, label_opts=opts.LabelOpts(is_show=False), # 根据 echarts demo 的原版是这么写的 # itemstyle_opts=opts.ItemStyleOpts( # color=JsCode(""" # function(params) { # var colorList; # if (data.datas[params.dataIndex][1]>data.datas[params.dataIndex][0]) { # colorList = '#ef232a'; # } else { # colorList = '#14b143'; # } # return colorList; # } # """) # ) # 改进后在 grid 中 add_js_funcs 后变成如下 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["times"]).add_yaxis( series_name="MACD", yaxis_data=data["macds"], 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["times"]).add_yaxis( series_name="DIF", y_axis=data["difs"], xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), ).add_yaxis( series_name="DEA", y_axis=data["deas"], xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), ).set_global_opts(legend_opts=opts.LegendOpts(is_show=False))) rsi_line = (Line().add_xaxis(xaxis_data=data["times"]).add_yaxis( series_name="rsi6", y_axis=data["rsi6"], xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), ).add_yaxis( series_name="rsi12", y_axis=data["rsi12"], xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), ).add_yaxis( series_name="rsi24", y_axis=data["rsi24"], xaxis_index=2, yaxis_index=2, label_opts=opts.LabelOpts(is_show=False), ).set_global_opts(legend_opts=opts.LegendOpts(is_show=False))) # MACD overlap_bar_line = bar_2.overlap(line_2) # 最后的 Grid grid_chart = Grid( init_opts=opts.InitOpts(width="1400px", height="800px")) # 这个是为了把 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="4%", pos_right="1%", height="45%"), ) # Volumn 柱状图 grid_chart.add( bar_1, grid_opts=opts.GridOpts(pos_left="4%", pos_right="1%", pos_top="56%", height="10%"), ) # MACD DIFS DEAS grid_chart.add( overlap_bar_line, grid_opts=opts.GridOpts(pos_left="4%", pos_right="1%", pos_top="68%", height="14%"), ) # rsi6 grid_chart.add( rsi_line, grid_opts=opts.GridOpts(pos_left="4%", pos_right="1%", pos_top="84%", height="10%"), ) return grid_chart.render_embed()
# radius=[30, 75], # is_legend_show=False, # is_label_show=True, ) pie1.render('评分.html') #%% datas['dates'] = datas.date.apply(lambda x:pd.Timestamp(x).date()) datas['time'] = datas.date.apply(lambda x:pd.Timestamp(x).time().hour) num_date = datas.author.groupby(datas['dates']).count() # 评论数时间分布 chart = Line("评论数时间分布") chart.use_theme('dark') chart.add( '评论数时间分布',num_date.index, num_date.values, is_fill=True, line_opacity=0.2, area_opacity=0.4, symbol=None) chart.render('评论时间分布.html') # 好评字数分布 datalikes = datas.loc[datas.likes>5] datalikes['num'] = datalikes.content.apply(lambda x:len(x)) chart = Scatter("likes") chart.use_theme('dark') chart.add('likes', np.log(datalikes.likes), datalikes.num, is_visualmap=True, xaxis_name = 'log(评论字数)', )
Line(opts.InitOpts(bg_color="#1A1835", )) # 设置图形的全局参数 .set_global_opts( tooltip_opts=opts.TooltipOpts(is_show=False), legend_opts=opts.LegendOpts(textstyle_opts=opts.TextStyleOpts( color='#90979c')), xaxis_opts=opts.AxisOpts( type_="category", axisline_opts=opts.AxisLineOpts(linestyle_opts=opts.LineStyleOpts( color="rgba(204,187,225,0.5)")), splitline_opts=opts.SplitLineOpts(is_show=False), axistick_opts=opts.AxisTickOpts(is_show=False)), yaxis_opts=opts.AxisOpts( type_="value", axistick_opts=opts.AxisTickOpts(is_show=True), splitline_opts=opts.SplitLineOpts(is_show=False), axisline_opts=opts.AxisLineOpts(linestyle_opts=opts.LineStyleOpts( color="rgba(204,187,225,0.5)")), ), datazoom_opts=opts.DataZoomOpts( is_show=True, )).add_xaxis(xaxis_data=x_data).add_yaxis( series_name="访问量", y_axis=y_data, symbol="circle", symbol_size=10, is_symbol_show=True, label_opts=opts.LabelOpts(is_show=False), itemstyle_opts=opts.ItemStyleOpts(color="#6f7de3"), markpoint_opts=opts.MarkPointOpts( label_opts=opts.LabelOpts(color='#fff'), data=[ opts.MarkPointItem(type_='max', name='最大值'), opts.MarkPointItem(type_='min', name='最小值') ])).add_yaxis( series_name="订单量", y_axis=y2_data, symbol="circle", symbol_size=10, is_symbol_show=True, label_opts=opts.LabelOpts(is_show=False), itemstyle_opts=opts.ItemStyleOpts(color="#c257F6"), markpoint_opts=opts.MarkPointOpts( label_opts=opts.LabelOpts(color='#fff'), data=[ opts.MarkPointItem(type_='max', name='最大值'), opts.MarkPointItem(type_='min', name='最小值') ])).render("basic_line_chart.html"))
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")
linestyle_opts=opts.LineStyleOpts(color="#5793f3") ), axislabel_opts=opts.LabelOpts(formatter="{value} ml"), ), title_opts=opts.TitleOpts(title="Grid-Overlap-多 X/Y 轴示例"), tooltip_opts=opts.TooltipOpts(trigger="axis", axis_pointer_type="cross"), legend_opts=opts.LegendOpts(pos_left="25%"), ) ) line = ( Line() .add_xaxis(["{}月".format(i) for i in range(1, 13)]) .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), ) ) bar1 = ( Bar() .add_xaxis(["{}月".format(i) for i in range(1, 13)]) .add_yaxis( "蒸发量 1", [2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3], color="#d14a61", xaxis_index=1, yaxis_index=3,
def ka_to_echarts(ka: KlineAnalyze, width="1500px", height='800px'): # 配置项设置 # ------------------------------------------------------------------------------------------------------------------ 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="{} - {}".format(ka.symbol, ka.name), subtitle="from {} to {}".format(ka.start_dt, ka.end_dt), 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", 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 ka.kline_raw] k_data = [[x['open'], x['close'], x['low'], x['high']] for x in ka.kline_raw] ma = ka.ma vol = [] for row in ka.kline_raw: item_style = red_item_style if row['close'] > row['open'] else green_item_style bar = opts.BarItem(value=row['vol'], itemstyle_opts=item_style, label_opts=label_not_show_opts) vol.append(bar) macd = [] for row in ka.macd: item_style = red_item_style if row['macd'] > 0 else green_item_style bar = opts.BarItem(value=round(row['macd'], 4), itemstyle_opts=item_style, label_opts=label_not_show_opts) macd.append(bar) diff = [round(x['diff'], 4) for x in ka.macd] dea = [round(x['dea'], 4) for x in ka.macd] # 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 = [x for x in ma[0].keys() if "ma" in x][:3] ma_colors = ["#39afe6", "#da6ee8", "#00940b"] for i, k in enumerate(ma_keys): y_data = [x[k] for x in ma] chart_ma.add_yaxis(series_name=k.upper(), y_axis=y_data, 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) # 缠论结果 # ------------------------------------------------------------------------------------------------------------------ fx_dts = [x['dt'] for x in ka.fx_list] fx_val = [x['fx'] for x in ka.fx_list] 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) bi_dts = [x['dt'] for x in ka.bi_list] bi_val = [x['bi'] for x in ka.bi_list] chart_bi = Scatter() 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)",)) chart_bi.set_global_opts(xaxis_opts=grid0_xaxis_opts, legend_opts=legend_not_show_opts) chart_k = chart_k.overlap(chart_bi) xd_dts = [x['dt'] for x in ka.xd_list] xd_val = [x['xd'] for x in ka.xd_list] chart_xd = Scatter() 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) # 成交量图 # ------------------------------------------------------------------------------------------------------------------ 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_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
df.sort_index(inplace=True) # 索引排序,inplace=True表示修改这个索引 df.head() # In[12]: # 2、使用pyecharts绘制折线图 from pyecharts.charts import Line from pyecharts import options as opts import matplotlib.pyplot as plt get_ipython().run_line_magic('matplotlib', 'inline') # In[13]: # 折线图 line = Line() # 折线图对象 # x轴 line.add_xaxis(df.index.to_list()) # x轴数据:列表——日期 # 每个y轴 line.add_yaxis("开盘价", df['open'].round(2).to_list()) line.add_yaxis("收盘价", df['close'].round(2).to_list()) # 图标配置 line.set_global_opts(title_opts=opts.TitleOpts(title='百度股票2019年'), tooltip_opts=opts.TooltipOpts(trigger='axix', axis_pointer_type='cross')) # In[15]:
def trans_data_to_use(dataset: list): size = len(dataset) # 元组中可能数据大小不一致,因此先进行转化 dataset = np.array(dataset) k = 1 / 1024 # 得到测试的时刻 x_data = dataset[:, 10] y_data_1 = np.array(dataset[:, 1], float) * k y_data_1 = np.round(y_data_1, decimals=1) y_data_2 = np.array(dataset[:, 2], float) * k y_data_2 = np.round(y_data_2, decimals=1) y_data_3 = np.array(dataset[:, 3], float) * k y_data_3 = np.round(y_data_3, decimals=1) y_data_4 = np.array(dataset[:, 4], float) * k y_data_4 = np.round(y_data_4, decimals=1) y_data_5 = np.array(dataset[:, 5], float) * k y_data_5 = np.round(y_data_5, decimals=1) y_data_6 = np.array(dataset[:, 6], float) * k y_data_6 = np.round(y_data_6, decimals=1) y_data_7 = np.array(dataset[:, 7], float) * k y_data_7 = np.round(y_data_7, decimals=1) y_data_8 = np.array(dataset[:, 8], float) * k y_data_8 = np.round(y_data_8, decimals=1) (Line(init_opts=opts.InitOpts(width="1600px", height="800px")).add_xaxis( xaxis_data=x_data).add_yaxis( series_name="java_heap", y_axis=y_data_1, linestyle_opts=opts.LineStyleOpts(width=2), ).add_yaxis( series_name="native_heap", y_axis=y_data_2, linestyle_opts=opts.LineStyleOpts(width=2)).add_yaxis( series_name="code", y_axis=y_data_3, linestyle_opts=opts.LineStyleOpts(width=2)).add_yaxis( series_name="stack", y_axis=y_data_4, linestyle_opts=opts.LineStyleOpts(width=2)).add_yaxis( series_name="graphics", y_axis=y_data_5, linestyle_opts=opts.LineStyleOpts(width=2)).add_yaxis( series_name="private_other", y_axis=y_data_6, linestyle_opts=opts.LineStyleOpts(width=2)). add_yaxis(series_name="system", y_axis=y_data_7, linestyle_opts=opts.LineStyleOpts(width=2)).add_yaxis( series_name="total", y_axis=y_data_8, linestyle_opts=opts.LineStyleOpts(width=2)).set_global_opts( title_opts=opts.TitleOpts(title="memory information", pos_left="center"), tooltip_opts=opts.TooltipOpts( trigger="item", formatter="{a} <br/>{b} : {c}"), legend_opts=opts.LegendOpts(pos_left="left"), xaxis_opts=opts.AxisOpts(type_="category", name="x"), yaxis_opts=opts.AxisOpts( type_="log", name="y", splitline_opts=opts.SplitLineOpts(is_show=True), is_scale=True, ), ).render("memory.html"))
from pywebio.output import put_html import pyecharts.options as opts from pyecharts.charts import Line from pyecharts.faker import Faker c = ( Line() .add_xaxis(Faker.choose()) .add_yaxis( "商家A", Faker.values(), markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_="average")]), ) .add_yaxis( "商家B", Faker.values(), markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_="average")]), ) .set_global_opts(title_opts=opts.TitleOpts(title="Line-MarkLine")) ) c.width = "100%" put_html(c.render_notebook())
def paint(cls, result, file_name, title="标题", is_df=False, indicator_index={}): """ 绘制K线 :param result: 数据 :param file_name: 保存到指定文件 :param title: 标题 :param is_df: 是否是DataFrame类型数据 :param indicator_index: 指标 {'ma20': 6} -- {'指标': '索引'} :return: """ time_list = [] kline_data = [] line_data = [] # print(result) if is_df: # 遍历DataFrame result = result.values for item in result: # 数据 kline_data.append([ float(item[1]), # open float(item[4]), # close float(item[3]), # low float(item[2]), # high ]) # 时间 time_list.append(str(item[0])) # line if 'ma20' in indicator_index: line_data.append(item[indicator_index['ma20']]) else: for item in result: # 数据 kline_data.append([ float(item['open']), float(item['close']), float(item['low']), float(item['high']), ]) # 时间 time_list.append(str(item['candle_begin_time'])) # K线 kline = (Kline().add_xaxis(time_list).add_yaxis( "K线", kline_data).set_global_opts( 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)), ), datazoom_opts=[opts.DataZoomOpts()], title_opts=opts.TitleOpts(title=title), )) # 均线 line = (Line().add_xaxis(time_list).add_yaxis( "MA30", line_data).set_series_opts(label_opts=opts.LabelOpts( is_show=False))) kline.overlap(line) return kline.render_embed()
暂无 """ x_data = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"] y_data = [820, 932, 901, 934, 1290, 1330, 1320] ( Line() .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), areastyle_opts=opts.AreaStyleOpts(opacity=1, color="#C67570"), ) .set_global_opts( tooltip_opts=opts.TooltipOpts(is_show=False), 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), ) # 设置 boundary_gap 的时候一定要放在最后一个配置项里, 不然会被覆盖 .render("basic_area_chart.html") )
# bar demo2 bar = (Bar(init_opts=opts.InitOpts(theme=ThemeType.CHALK)).add_xaxis( ["衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子"]).add_yaxis("商家A", [5, 20, 36, 10, 75, 90]).add_yaxis( "商家B", [15, 6, 45, 20, 35, 66]).set_global_opts( title_opts=opts.TitleOpts(title="主标题", subtitle="副标题"))) bar.render() lin = ( Line(init_opts=opts.InitOpts(theme=ThemeType.CHALK)).add_xaxis([ "衬衫", "羊毛衫", "雪纺衫", "裤子", "高跟鞋", "袜子" ]).add_yaxis("商家A", [5, 20, 36, 10, 75, 90], is_smooth=True).add_yaxis( "商家B", [15, 6, 45, 20, 35, 66], is_smooth=True).set_global_opts( title_opts=opts.TitleOpts(title="主标题", subtitle="副标题"), xaxis_opts=opts.AxisOpts(name='日期'), yaxis_opts=opts.AxisOpts( name='数量', max_=16000, min_=1, type_="log", # 坐标轴配置项 splitline_opts=opts.SplitLineOpts(is_show=True), # 分割线配置项 axisline_opts=opts.AxisLineOpts(is_show=True)))) lin.render() lin.overlap(bar) lin.render() get_line() value = [95.1, 23.2, 43.3, 66.4, 88.5] attr = ["China", "Canada", "Brazil", "Russia", "United States"] map = Map("世界地图示例")
from pyecharts import options as opts from pyecharts.charts import Bar, Grid, Line from pyecharts.faker import Faker bar = (Bar().add_xaxis(Faker.choose()).add_yaxis( "商家A", Faker.values()).add_yaxis("商家B", Faker.values()).set_global_opts( title_opts=opts.TitleOpts(title="Grid-Bar"))) line = (Line().add_xaxis(Faker.choose()).add_yaxis( "商家A", Faker.values()).add_yaxis("商家B", Faker.values()).set_global_opts( title_opts=opts.TitleOpts(title="Grid-Line", pos_top="48%"), legend_opts=opts.LegendOpts(pos_top="48%"), )) grid = (Grid().add(bar, grid_opts=opts.GridOpts(pos_bottom="60%")).add( line, grid_opts=opts.GridOpts(pos_top="60%")).render("grid_vertical.html"))
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), ))
Line().add_xaxis(date_list).add_yaxis( '确诊数据', confirm_list, is_smooth=True, markline_opts=opts.MarkLineOpts( data=[opts.MarkLineItem(type_="average")])).add_yaxis( '疑似数据', suspect_list, is_smooth=True, markline_opts=opts.MarkLineOpts( data=[opts.MarkLineItem(type_="average")]), ).add_yaxis( '死亡数据', dead_list, is_smooth=True, markline_opts=opts.MarkLineOpts( data=[opts.MarkLineItem(type_="average")]), ).add_yaxis( '治愈数据', heal_list, is_smooth=True, markline_opts=opts.MarkLineOpts( data=[opts.MarkLineItem(type_="average")]), ) # 隐藏数字 设置面积 .set_series_opts(areastyle_opts=opts.AreaStyleOpts(opacity=0.5), label_opts=opts.LabelOpts(is_show=False)) # 设置x轴标签旋转角度 .set_global_opts( xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-30)), yaxis_opts=opts.AxisOpts(name='人数', min_=3), title_opts=opts.TitleOpts(title='2019-nCoV疫情曲线图')))
def grid_mutil_yaxis() -> Grid: x_data = ["{}月".format(i) for i in range(1, 13)] bar = ( Bar() .add_xaxis(x_data) .add_yaxis( "蒸发量", [2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3], yaxis_index=0, color="#d14a61", ) .add_yaxis( "降水量", [2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3], yaxis_index=1, color="#5793f3", ) .extend_axis( yaxis=opts.AxisOpts( name="蒸发量", type_="value", min_=0, max_=250, position="right", axisline_opts=opts.AxisLineOpts( linestyle_opts=opts.LineStyleOpts(color="#d14a61") ), axislabel_opts=opts.LabelOpts(formatter="{value} ml"), ) ) .extend_axis( yaxis=opts.AxisOpts( type_="value", name="温度", min_=0, max_=25, position="left", axisline_opts=opts.AxisLineOpts( linestyle_opts=opts.LineStyleOpts(color="#675bba") ), axislabel_opts=opts.LabelOpts(formatter="{value} °C"), splitline_opts=opts.SplitLineOpts( is_show=True, linestyle_opts=opts.LineStyleOpts(opacity=1) ), ) ) .set_global_opts( yaxis_opts=opts.AxisOpts( name="降水量", 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) return Grid().add( bar, opts.GridOpts(pos_left="5%", pos_right="20%"), is_control_axis_index=True )
import pyecharts.options as opts from pyecharts.charts import Line from pyecharts.faker import Faker y = Faker.values() y[3], y[5] = None, None c = (Line().add_xaxis(Faker.choose()).add_yaxis( "商家A", y, is_connect_nones=True).set_global_opts(title_opts=opts.TitleOpts( title="Line-连接空数据")).render("Line_connect_null.html"))
def draw(cls, data_list: typing.List[ClassifierResult], report_path: str = None, data_path: str = None): # draw line chart x_axis = [str(i.timestamp) for i in data_list] y_axis = [i.stage for i in data_list] line = Line() line.add_xaxis(x_axis) line.add_yaxis("stage", y_axis, is_step=True, is_symbol_show=True) line.set_global_opts( title_opts=opts.TitleOpts(title='Trend'), toolbox_opts=opts.ToolboxOpts(is_show=True), tooltip_opts=opts.TooltipOpts(is_show=True, trigger='axis', axis_pointer_type='cross'), ) # draw bar chart bar = Bar() x_axis = sorted(list(set([i.stage for i in data_list]))) bar.add_xaxis(x_axis) y_axis = list() offset = data_list[1].timestamp - data_list[0].timestamp for each_stage_name in x_axis: each_stage = sorted( [i for i in data_list if i.stage == each_stage_name], key=lambda x: x.frame_id) time_cost = each_stage[-1].timestamp - each_stage[ 0].timestamp + offset y_axis.append(time_cost) bar.add_yaxis('time cost', y_axis) bar.set_global_opts( title_opts=opts.TitleOpts(title="Time Cost"), toolbox_opts=opts.ToolboxOpts(is_show=True), ) logger.debug(f'time cost: {dict(zip(x_axis, y_axis))}') # draw pie chart pie = Pie() pie.add('', [list(z) for z in zip(x_axis, y_axis)]) pie.set_global_opts(toolbox_opts=opts.ToolboxOpts(is_show=True), ) # merge charts page = Page() page.add(line) page.add(bar) page.add(pie) # insert sample pictures' path if data_path and os.path.isdir(data_path): data_path = os.path.abspath(data_path) stage_list = [ os.path.join(data_path, i) for i in os.listdir(data_path) ] else: logger.warning(f'data path {data_path} not existed') stage_list = [] # save to file if not report_path: report_path = f'{toolbox.get_timestamp_str()}.html' template = Template(TEMPLATE) template_content = template.render( chart=Markup(page.render_embed()), pic_list=stage_list, ) with open(report_path, "w") as fh: fh.write(template_content) logger.info(f'save report to {report_path}')
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 = ka.to_df(use_macd=True, ma_params=(5, 20,)) 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)
df['dateTime'] = df['date'] + ' ' + df['time'] line = ( Line().add_xaxis(df['dateTime'].tolist()).add_yaxis( "下載", df['download'], markline_opts=opts.MarkLineOpts( data=[opts.MarkLineItem(type_="average", name="平均值") ])).set_series_opts( areastyle_opts=opts.AreaStyleOpts(opacity=0.1), label_opts=opts.LabelOpts(is_show=False) #顯示資料點 ).set_global_opts( title_opts=opts.TitleOpts(title="FTP流量分析"), toolbox_opts=opts.ToolboxOpts(), datazoom_opts=opts.DataZoomOpts(), xaxis_opts=opts.AxisOpts( name="日期", splitline_opts=opts.SplitLineOpts(is_show=True)), yaxis_opts=opts.AxisOpts( type_="log", name="秒", splitline_opts=opts.SplitLineOpts(is_show=True), is_scale=True), #交點輔助線 tooltip_opts=opts.TooltipOpts( is_show=True, trigger='axis', ), )) line.render()
def visual(self, name='model_visual', path=None, gif=False): """ Arguments: name : str, train end save last image or gif file with html format name. path : str, train end save last image or gif file with html format to path; save_gif : bool, default False, if save_gif=True, train end save all image to gif; Return: a html file path. """ if path is not None: assert tf.io.gfile.exists(path), "`path` not exist." file = path + '/' + '{}.html'.format(name) else: file = '{}.html'.format(name) page = Page(interval=1, layout=Page.SimplePageLayout) plot_list = [] width_len = '750px' height_len = '450px' for metric_id, metric in enumerate(self.params.metrics): if not gif: line = Line(opts.InitOpts(width=width_len, height=height_len)) line = line.add_xaxis(list(range(1, self.params.polt_num + 1))) line = line.add_yaxis( 'train', Series(self.params.logs[metric]).round(4).tolist(), is_smooth=True) if self.params.valid_fmt.format(metric) in self.params.logs: line = line.add_yaxis( self.params.valid_fmt.split('_')[0], Series(self.params.logs[self.params.valid_fmt.format( metric)]).round(4).tolist(), is_smooth=True) line = line.set_series_opts( label_opts=opts.LabelOpts(is_show=False), markpoint_opts=opts.MarkPointOpts(data=[ opts.MarkPointItem(type_='max', name='max_value'), opts.MarkPointItem(type_='min', name='min_value') ])) line = line.set_global_opts( title_opts=opts.TitleOpts(title=metric), xaxis_opts=opts.AxisOpts( name=self.params.xlabel[self.params.mode], name_location='center', is_scale=True), datazoom_opts=[ opts.DataZoomOpts(range_start=0, range_end=100) ], toolbox_opts=opts.ToolboxOpts()) plot_list.append(line) else: timeline = Timeline( opts.InitOpts(width=width_len, height=height_len)).add_schema( play_interval=100, is_auto_play=True) for i in range(1, self.params.polt_num + 1): line = Line( opts.InitOpts(width=width_len, height=height_len)) line = line.add_xaxis(list(range(1, i + 1))) line = line.add_yaxis( 'train', Series(self.params.logs[metric])[:i].round(4).tolist(), is_smooth=True) if self.params.valid_fmt.format( metric) in self.params.logs: line = line.add_yaxis( self.params.valid_fmt.split('_')[0], Series( self.params.logs[self.params.valid_fmt.format( metric)])[:i].round(4).tolist(), is_smooth=True) line = line.set_series_opts( label_opts=opts.LabelOpts(is_show=False), markpoint_opts=opts.MarkPointOpts(data=[ opts.MarkPointItem(type_='max', name='max_value'), opts.MarkPointItem(type_='min', name='min_value') ])) line = line.set_global_opts( title_opts=opts.TitleOpts(title=metric), xaxis_opts=opts.AxisOpts( name=self.params.xlabel[self.params.mode], name_location='center', is_scale=True)) timeline.add(line, str(i)) plot_list.append(timeline) page.add(*plot_list).render(file) return file
from pyecharts import options as opts # ============================================================================= # # V1 版本开始支持链式调用 # bar = ( # Bar() # .add_xaxis(["衬衫", "毛衣", "领带", "裤子", "风衣", "高跟鞋", "袜子"]) # .add_yaxis("商家A", [114, 55, 27, 101, 125, 27, 105]) # .add_yaxis("商家B", [57, 134, 137, 129, 145, 60, 49]) # .set_global_opts(title_opts=opts.TitleOpts(title="某商场销售情况")) # ) # bar.render() # # # 不习惯链式调用的开发者依旧可以单独调用方法 # bar = Bar() # bar.add_xaxis(["衬衫", "毛衣", "领带", "裤子", "风衣", "高跟鞋", "袜子"]) # bar.add_yaxis("商家A", [114, 55, 27, 101, 125, 27, 105]) # bar.add_yaxis("商家B", [57, 134, 137, 129, 145, 60, 49]) # bar.set_global_opts(title_opts=opts.TitleOpts(title="某商场销售情况")) # bar.render() # # ============================================================================= #普通折线图 c = (Line().add_xaxis(["衬衫", "毛衣", "领带", "裤子", "风衣", "高跟鞋", "袜子"]).add_yaxis( "商家A", [114, 55, 27, 101, 125, 27, 105]).add_yaxis( "商家B", [57, 134, 137, 129, 145, 60, 49]).set_global_opts( title_opts=opts.TitleOpts(title="Line-基本示例"))) c.render()
def rendertohtml(self, resultset): page = Page() if resultset is None: print('无数据') return None header = [ '日期', '股票代码 ', '股票名称 ', '持股数亿', '占比', '收盘价 ', '当日涨跌幅 ', '持股市值亿 ', '一日市值变化亿', '五日市值变化亿', '十日市值变化亿' ] tb = pt.PrettyTable() tb.field_names = header # 设置表头 tb.align = 'c' # 对齐方式(c:居中,l居左,r:居右) c = Line() x = ['持股占比'] name = '' HDDATELIST = [] SHAREHOLDSUMlist = [] # 持股数 SHARESRATElist = [] # 持股占比 SHAREHOLD = [] # 持股数量 zdflist = [] SHAREHOLDPRICEONElist = [] SHAREHOLDPRICEFIVElist = [] SHAREHOLDPRICETENlsit = [] # 取出占比数据 for data in resultset: HDDATE = data['HDDATE'] # HDDATE = datetime.datetime.strptime(HDDATE1, '%Y-%m-%d').strftime('%Y%m%d') HDDATELIST.append(HDDATE) SCODE = data['SCODE'] SHAREHOLDSUM = data['SHAREHOLDSUM'] SHAREHOLDSUMlist.append(SHAREHOLDSUM) SNAME = data['SNAME'] SHARESRATE = data['SHARESRATE'] SHARESRATElist.append(SHARESRATE) CLOSEPRICE = data['CLOSEPRICE'] ZDF = data['ZDF'] zdflist.append(ZDF) SHAREHOLDPRICE = format(data['SHAREHOLDPRICE'], '.3f') SHAREHOLDPRICEONE = format(data['SHAREHOLDPRICEONE'], '.3f') SHAREHOLDPRICEONElist.append(SHAREHOLDPRICEONE) SHAREHOLDPRICEFIVE = format(data['SHAREHOLDPRICEFIVE'], '.3f') SHAREHOLDPRICEFIVElist.append(SHAREHOLDPRICEFIVE) SHAREHOLDPRICETEN = format(data['SHAREHOLDPRICETEN'], '.3f') SHAREHOLDPRICETENlsit.append(SHAREHOLDPRICETEN) tb.add_row([ HDDATE, SCODE, SNAME, SHAREHOLDSUM, SHARESRATE, CLOSEPRICE, ZDF, SHAREHOLDPRICE, SHAREHOLDPRICEONE, SHAREHOLDPRICEFIVE, SHAREHOLDPRICETEN ]) OUTFILE = '南向资金_' + SNAME + '.html' # print(SHARESRATE) x1 = HDDATELIST y1 = SHARESRATElist # 将占比数据设置为y轴 y2 = SHAREHOLDSUMlist y3 = zdflist y4 = SHAREHOLDPRICEONElist y5 = SHAREHOLDPRICEFIVElist y6 = SHAREHOLDPRICETENlsit # y2 = [1000, 300, 500] # bar = Bar() # 设置x轴 c.add_xaxis(xaxis_data=x) c.add_xaxis(xaxis_data=x1) # 设置y轴 c.add_yaxis(series_name='持股百分比', y_axis=y1) # c.add_yaxis(series_name='持股数量亿', y_axis=y2) # c.add_yaxis(series_name='涨跌幅', y_axis=y3) c.add_yaxis(series_name='1日市值变动亿', y_axis=y4) c.add_yaxis(series_name='5日市值变动亿', y_axis=y5) c.add_yaxis(series_name='10日市值变动亿', y_axis=y6) c.set_global_opts(title_opts=opts.TitleOpts(title='南向资金持股分析: ' + SNAME)) # 生成html文件 # c.render(path=OUTFILE) page.add(c) page.render(path=OUTFILE) # 如果要输出柱图 ''' bar = Bar() 然后将c 换成bar ''' #获取港股日线数据并画K线图 getstockdata = self.getHK_stockQuotes(SCODE) if len(getstockdata) < 90: getstockdata = getstockdata else: getstockdata = getstockdata.tail(90) #只后90行 # print(getstockdata) if getstockdata.items == None: kline = '' else: # getstockdata['trade_date'] = pd.to_datetime(getstockdata.index) # 设置字段trade_date 为datetime # getstockdata = getstockdata.set_index('trade_date') # 设置trade_date为索引 index = getstockdata.index.tolist() # getstockdata.sort_values(by=[getstockdata.index().to_list,'close'],ascending=False) # 设置四个绘图区域 包括 K线(均线),成交量,MACD np.seterr(divide='ignore', invalid='ignore') # 忽略warning plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签 plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 fig, ax = plt.subplots(figsize=(9, 6)) # 创建fig对象 # 画绘图区域 gs = gridspec.GridSpec(2, 1, left=0.08, bottom=0.15, right=0.99, top=0.96, wspace=None, hspace=0, height_ratios=[3.5, 1]) # 添加指标 graph_KAV = fig.add_subplot(gs[0, :]) # K线图 graph_VOL = fig.add_subplot(gs[1, :]) # graph_MACD = fig.add_subplot(gs[2, :]) # graph_KDJ = fig.add_subplot(gs[3, :]) mpf.candlestick2_ochl(graph_KAV, getstockdata.open, getstockdata.close, getstockdata.high, getstockdata.low, width=0.5, colorup='r', colordown='g') # 绘制K线走势 # mpf.plot(getstockdata.iloc[:100],type='candle') # 绘制K线走势 # 绘制移动平均线图 getstockdata['Ma5'] = getstockdata.close.rolling(window=5).mean( ) # pd.rolling_mean(df_stockload.close,window=20) getstockdata['Ma10'] = getstockdata.close.rolling(window=10).mean( ) # pd.rolling_mean(df_stockload.close,window=30) getstockdata['Ma20'] = getstockdata.close.rolling(window=20).mean() graph_KAV.plot(np.arange(0, len(index)), getstockdata['Ma5'], 'black', label='M5', lw=1.0) graph_KAV.plot(np.arange(0, len(index)), getstockdata['Ma10'], 'green', label='M10', lw=1.0) graph_KAV.plot(np.arange(0, len(index)), getstockdata['Ma20'], 'blue', label='M20', lw=1.0) # 添加网格 graph_KAV.grid() graph_KAV.legend(loc='best') graph_KAV.set_title(SCODE + ' ' + SNAME + '(日线)') graph_KAV.set_ylabel(u"价格") graph_KAV.set_xlim(0, len(index)) # 设置一下x轴的范围 # 绘制成交量图 graph_VOL.bar( np.arange(0, len(index)), getstockdata.volume, color=[ 'g' if getstockdata.open[x] > getstockdata.close[x] else 'r' for x in range(0, len(index)) ]) graph_VOL.set_ylabel(u"成交量") graph_VOL.set_xlim(0, len(index)) # 设置一下x轴的范围 graph_VOL.set_xticks(range(0, len(index), 1)) # X轴刻度设定 每1天标一个日期 # X-轴每个ticker标签都向右倾斜45度 for label in graph_KAV.xaxis.get_ticklabels(): label.set_visible(False) for label in graph_VOL.xaxis.get_ticklabels(): label.set_visible(True) label.set_fontsize(10) plt.savefig('./Kline.jpg') kline = '''<img src=./Kline.jpg />''' # 将数据也输出到文件 s = tb.get_html_string() with open(OUTFILE, 'a+', encoding='utf-8') as fw: fw.write(kline) fw.write(s) fw.close() webbrowser.open(OUTFILE) # 调用浏览器打开文件
def generate_mchart(self,lst_tscode=[],lst_macro=['shibor.1w','pimon.nt_yoy','pimon.ppi_yoy','pimon.m1_yoy','pimon.m2_yoy','pimon.allstock_circ_mv_sum'], lst_findmedian=['pe',()],renderfile=False) -> Grid: if self.exists == False: return None ''' testing findmedian with a given index ''' # df=self._dataagent.query('index_weight',index_code='000300.SH',start_date='20200630', end_date='20200630') # lst_findmedian=['pb',tuple(df['con_code'].values)] ''' ----------test end--------------------''' lst_tscode=list(set([self.ts_code,*lst_tscode])) # lst_findmedian[1] = tuple(self._dataagent.registry.loc[self._dataagent.registry['sec_type']=='stk']['ts_code']) if lst_findmedian[1] is None or len(lst_findmedian[1])==0 else lst_findmedian[1] dat_cursor = self.cursorTick['timeAxis'] int_latestViewDate = self._dataagent.int_findClosestTradeDate(datetime.strftime(dat_cursor,'%Y%m%d') ) df_baseCal = self._dataagent.df_calTbl.loc[self._dataagent.df_calTbl['cal_date']<=int_latestViewDate]['cal_date'].copy() lst_xaxis = ['{}/{}/{}'.format(i[:4],i[4:6],i[6:]) for i in df_baseCal.values.astype('str')] # xaxis values has to be STRING type, int will not work linechart = ( Line() .add_xaxis(lst_xaxis) ) # 生成主线,即目标证券/指数,及比较用的指数 for str_tscode in lst_tscode: # str_tscode = DataAgent.formatCode(code) df_target = self._dataagent.query('load_alldaily',tpl_dateindex=tuple(df_baseCal),ts_code=str_tscode) if len(df_target)>0: df_toPlot = pd.merge(left=df_baseCal, right=df_target, how='left', left_on='cal_date', right_on='trade_date') else: continue '''=====主图画图部分包括主标的和副标的价格曲线,在主图中续把主图及后面叠加图的option,y轴等设置好===''' linename = '{} - {}'.format(str_tscode,self.sec_name) lst_values = list(df_toPlot['close']) lst_values = list(libs.normByRange(lst_values)) 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), itemstyle_opts=opts.ItemStyleOpts( color="#00da3c", ), ) linechart.extend_axis( # 所有保持原比例的折线都放在linechart2里,使用右侧y轴 yaxis=opts.AxisOpts( name="倍数", type_="value", position="right", axisline_opts=opts.AxisLineOpts( linestyle_opts=opts.LineStyleOpts(color="black") ), axislabel_opts=opts.LabelOpts(formatter="{value}倍"), ) ) 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", ), ) '''=============================主图画图部分结束=================''' '''=========叠加图1 尝试读取pe等股票才有的属性,如失败则说明不是股票,循环继续=============''' try: lst_pe = df_toPlot['pe'].values.tolist() lst_pb = df_toPlot['pb'].values.tolist() lst_pepb = [round(lst_pe[index]/value,2) for index, value in enumerate(lst_pb) if value!=0] linechart.add_yaxis(str_tscode+"_PE", lst_pe, yaxis_index=1, #倍数使用右y轴 is_smooth=True, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=1), label_opts=opts.LabelOpts(is_show=False), ) linechart.add_yaxis(str_tscode+"_PE/PB", lst_pepb, yaxis_index=1, #倍数使用右y轴 is_smooth=True, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=1), label_opts=opts.LabelOpts(is_show=False), ) except: continue '''==========================叠加图1结束================================''' df_shibor = self._dataagent.query('load_shibor') # print('Supported shibor columns: {}'.format(df_shibor.columns)) df_aggDay = self._dataagent.query('load_aggDayKPI') # print('Supported macro eco columns: {}'.format(df_aggDay.columns)) df_pimon = self._dataagent.query('load_piMon') df_pimon = pd.merge(df_pimon, df_aggDay, how='left', left_on='date', right_on='trade_date') #与aggday按每月末日期合并以获得如“流通市值”等kpi # print('Supported macro eco columns: {}'.format(df_pimon.columns)) '''=================叠加图2 所有股票的倍数类KPI,使用倍数类y轴=============''' lst_aggDayKPIloop = ['allstock_pe_median','allstock_pe_ttm_median','allstock_pb_median','allstock_pepb_median'] for kpi in lst_aggDayKPIloop: lst_values = df_aggDay[kpi].values.tolist() linechart.add_yaxis(kpi, lst_values, yaxis_index=1, #倍数使用右y轴 is_smooth=True, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=1), label_opts=opts.LabelOpts(is_show=False), ) '''==========================叠加图2结束================================''' '''===========叠加图3 宏观数据如shibor,cpi,m1等,按“。”分割类别进行图表生成,使用等比类y轴 ========''' for item in lst_macro: try: topic,colname = item.split('.') except: print('WARNING! input code {} not recognized...'.format(item)) if topic=='shibor': df_target = df_shibor maxarr = df_target.max(axis=0, skipna=True).values[1:] minarr = df_target.min(axis=0, skipna=True).values[1:] deltaRng = max(maxarr)-min(minarr) # overwrite the normalization function delta to put all shibor rates comparable elif topic=='pimon': df_target = df_pimon deltaRng = None else: print('WARNING! subject code {} is not recognized...'.format(topic)) if len(df_target)>0: df_toPlot = pd.merge(df_baseCal, df_target, how='left', left_on='cal_date', right_on='date') df_toPlot[colname] = df_toPlot[colname].bfill() else: continue linename = item lst_values = list(df_toPlot[colname]) lst_values = list(libs.normByRange(lst_values,delta=deltaRng)) linechart.add_yaxis(linename, lst_values, # 所有等比例缩放的折线都放在linechart里,使用左侧y轴 is_smooth=True, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=1,opacity=0.5), label_opts=opts.LabelOpts(is_show=False), ) '''==========================叠加图3结束================================''' '''========叠加图4 如参数给出需要寻找中位数的股票列表则读取相应所有本地文件后计算并生成叠加图标========''' if lst_findmedian[1] is not None and len(lst_findmedian[1])>0 : str_cat = lst_findmedian[0] df_result = pd.DataFrame() for str_tscode in lst_findmedian[1]: try: df = self._dataagent.query('load_alldaily',tpl_dateindex=tuple(df_baseCal),ts_code=str_tscode)[['ts_code','trade_date',str_cat]] print('{} csv file loaded for {} trend analysis...'.format(str_tscode,str_cat),end='\r') except Exception as e: print('WARNING! {} csv file not found...'.format(str_tscode)) continue df_result = pd.concat([df_result,df]) df_result.dropna(subset=[str_cat],inplace=True) df_result = df_result.loc[df_result['trade_date']>19940301] # libs.df_csv(cfg.PATH_BUGFILE,(df_result.groupby('trade_date')['ts_code'].count(),)) # print(df_result.groupby('trade_date')['ts_code'].count()) df_target = df_result.groupby('trade_date')[str_cat].median() if len(df_target)>0: df_toPlot = pd.merge(left=df_baseCal, right=df_target, how='left', left_on='cal_date', right_on='trade_date') linename = '{}-median'.format(str_cat) lst_values = list(df_toPlot[str_cat]) lst_values = list(lst_values) linechart.add_yaxis(linename, lst_values, yaxis_index=1, is_smooth=True, is_hover_animation=False, linestyle_opts=opts.LineStyleOpts(width=1), label_opts=opts.LabelOpts(is_show=False), ) else: pass '''==========================叠加图4结束================================''' # 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 = '{}{}.html'.format(cfg.PATH_ANAFILE,'macro') gridChart.render(fname) if renderfile else None self.mchart = gridChart #输出至可访问对象属性中 return self