def plot(x, y, weight, o_file, num_file, part1, part2, chan, ymd, xname, xname_l, xunit, xmin, xmax, yname, yname_l, yunit, ymin, ymax, is_diagonal, is_monthly): plt.style.use(os.path.join(dvPath, "dv_pub_regression_dev.mplstyle")) # 过滤 正负 delta+8 倍 std 的杂点 ------------------------ w = 1.0 / weight if weight is not None else None RadCompare = G_reg1d(x, y, w) reg_line = x * RadCompare[0] + RadCompare[1] delta = np.abs(y - reg_line) mean_delta = np.mean(delta) std_delta = np.std(delta) max_y = reg_line + mean_delta + std_delta * 8 min_y = reg_line - mean_delta - std_delta * 8 idx = np.logical_and(y < max_y, y > min_y) x = x[idx] y = y[idx] w = w[idx] if weight is not None else None # ----------------------------------------- RadCompare = G_reg1d(x, y, w) length_rad = len(x) bias_and_md = [] # 当 bias 没有被计算的时候,不输出 bias if not is_monthly and is_diagonal: # return [len(x), RadCompare[0], RadCompare[1], RadCompare[4]] fig = plt.figure(figsize=(14, 4.5)) # fig.subplots_adjust(top=0.90) ax1 = plt.subplot2grid((1, 3), (0, 0)) ax2 = plt.subplot2grid((1, 3), (0, 1)) ax3 = plt.subplot2grid((1, 3), (0, 2)) # 图片 Title titleName = "%s-%s" % (xname.upper(), yname.upper()) title = "{} Regression {} Days {}_{} {} {}".format( titleName, num_file, part1, part2, chan, ymd) # 画回归图 ----------------------------------------------- print "draw regression" regress_xmin = xmin regress_xmax = xmax regress_ymin = ymin regress_ymax = ymax regress_axislimit = { "xlimit": (regress_xmin, regress_xmax), "ylimit": (regress_ymin, regress_ymax), } if xunit != "": xlabel = "{} {} (${}$)".format(part1, xname_l, xunit) else: xlabel = "{} {}".format(part1, xname_l) if yunit != "": ylabel = "{} {} (${}$)".format(part2, yname_l, yunit) else: ylabel = "{} {}".format(part2, yname_l) regress_label = { "xlabel": xlabel, "ylabel": ylabel, "fontsize": 14, } if xname == "tbb": regress_locator = {"locator_x": (None, None), "locator_y": (None, 5)} elif xname == "ref": regress_locator = {"locator_x": (None, None), "locator_y": (None, 5)} else: regress_locator = None regress_annotate = { "left": ["{:10}: {:7.4f}".format("Slope", RadCompare[0]), "{:10}: {:7.4f}".format("Intercept", RadCompare[1]), "{:10}: {:7.4f}".format("Cor-Coef", RadCompare[4]), "{:10}: {:7d}".format("Number", length_rad)], "fontsize": 14, } regress_tick = {"fontsize": 14, } regress_diagonal = {"line_color": "#808080", "line_width": 1.2} regress_regressline = {"line_color": "r", "line_width": 1.2} scatter_point = {"scatter_alpha": 0.8} dv_pub_3d_dev.draw_regression( ax1, x, y, label=regress_label, ax_annotate=regress_annotate, tick=regress_tick, axislimit=regress_axislimit, locator=regress_locator, diagonal=regress_diagonal, regressline=regress_regressline, scatter_point=scatter_point, ) # 画偏差分布图 --------------------------------------------- print "draw distribution" distri_xmin = xmin distri_xmax = xmax if xname == "tbb": distri_ymin = -4 distri_ymax = 4 elif xname == "ref": distri_ymin = -0.08 distri_ymax = 0.08 else: distri_ymin = None distri_ymax = None distri_limit = { "xlimit": (distri_xmin, distri_xmax), "ylimit": (distri_ymin, distri_ymax), } # x y 轴标签 xlabel = "{}".format(xname_l) if xname == "tbb": ylabel = "{} bias {}_{} ".format(xname.upper(), part1, part2, ) elif xname == "ref": ylabel = "{} bias {}_{} ".format(xname.capitalize(), part1, part2, ) else: ylabel = "{} bias {}_{} ".format(xname, part1, part2, ) distri_label = { "xlabel": xlabel, "ylabel": ylabel, "fontsize": 14, } # 获取 MeanBias 信息 bias_range = 0.15 boundary = xmin + (xmax - xmin) * 0.15 bias_info = bias_information(x, y, boundary, bias_range) # 格式化 MeanBias 信息 info_lower = "MeanBias(<={:d}%Range)=\n {:.4f}±{:.4f}@{:.4f}".format( int(bias_range * 100), bias_info.get("md_lower"), bias_info.get("std_lower"), bias_info.get("mt_lower")) info_greater = "MeanBias(>{:d}%Range)=\n {:.4f}±{:.4f}@{:.4f}".format( int(bias_range * 100), bias_info.get("md_greater"), bias_info.get("std_greater"), bias_info.get("mt_greater")) # 绝对偏差和相对偏差信息 TBB=250K REF=0.25 ab = RadCompare a = ab[0] b = ab[1] if xname == "tbb": bias = 250 - (250 * a + b) bias_info_md = "TBB Bias(250K):{:.4f}K".format(bias) elif xname == "ref": bias = (0.25 - (0.25 * a + b)) / 0.25 * 100 bias_info_md = "Relative Bias(REF0.25):{:.4f}%".format(bias) else: bias = np.NaN # RMD or TBB bias bias_info_md = "" bias_and_md.append(bias) # Range Mean : 偏差图的 MD 信息 if xname == "tbb": md_greater = bias_info.get("md_greater", np.NaN) md = md_greater elif xname == "ref": md_greater = bias_info.get("md_greater") mt_greater = bias_info.get("mt_greater") if md_greater is not None and mt_greater is not None: md = (md_greater / mt_greater) * 100 else: md = np.NaN else: md = np.NaN bias_and_md.append(md) # 添加注释信息 distri_annotate = {"left": [], "leftbottom": [], "right": [], "fontsize": 14, } distri_annotate.get("left").append(bias_info_md) distri_annotate.get("leftbottom").append(info_lower) distri_annotate.get("leftbottom").append(info_greater) # 添加 tick 信息 distri_tick = {"fontsize": 14, } # 添加间隔数量 if xname == "tbb": distri_locator = {"locator_x": (None, None), "locator_y": (8, 5)} elif xname == "ref": distri_locator = {"locator_x": (None, None), "locator_y": (8, 5)} else: distri_locator = None # y=0 线配置 zeroline = {"line_color": "#808080", "line_width": 1.0} # 偏差点配置 scatter_delta = { "scatter_marker": "o", "scatter_size": 5, "scatter_alpha": 0.8, "scatter_linewidth": 0, "scatter_zorder": 100, "scatter_color": BLUE, } # 偏差回归线配置 regressline = {"line_color": "r", "line_width": 1.2} dv_pub_3d_dev.draw_distribution(ax2, x, y, label=distri_label, ax_annotate=distri_annotate, tick=distri_tick, axislimit=distri_limit, locator=distri_locator, zeroline=zeroline, scatter_delta=scatter_delta, regressline=regressline, ) # 画直方图 -------------------------------------------------- print "draw histogram" histogram_xmin = xmin histogram_xmax = xmax histogram_axislimit = { "xlimit": (histogram_xmin, histogram_xmax), } histogram_xlabel = "{}".format(xname_l) histogram_ylabel = "match point numbers" histogram_label = { "xlabel": histogram_xlabel, "ylabel": histogram_ylabel, "fontsize": 14, } # 添加间隔数量 if xname == "tbb": histogram_locator = {"locator_x": (None, None), "locator_y": (None, 5)} elif xname == "ref": histogram_locator = {"locator_x": (None, None), "locator_y": (None, 5)} else: histogram_locator = None histogram_x = { "label": part1, "color": "red", "alpha": 0.4, "bins": 100, "fontsize": 14, } histogram_y = { "label": part2, "color": "blue", "alpha": 0.4, "bins": 100,"fontsize": 14, } histogram_tick = {"fontsize": 14, } dv_pub_3d_dev.draw_histogram( ax3, x, label=histogram_label, locator=histogram_locator, tick=histogram_tick, axislimit=histogram_axislimit, histogram=histogram_x, ) dv_pub_3d_dev.draw_histogram( ax3, y, label=histogram_label, locator=histogram_locator, tick=histogram_tick, axislimit=histogram_axislimit, histogram=histogram_y, ) elif not is_monthly and not is_diagonal: fig = plt.figure(figsize=(4.5, 4.5)) # fig.subplots_adjust(bottom=0.12, top=0.86) ax1 = plt.subplot2grid((1, 1), (0, 0)) # 图片 Title titleName = "%s-%s" % (xname.upper(), yname.upper()) title = "{} Regression {} Days\n{}_{} {} {}".format( titleName, num_file, part1, part2, chan, ymd) # 画回归图 ---------------------------------------------------- print "draw regression" regress_xmin = xmin regress_xmax = xmax regress_ymin = ymin regress_ymax = ymax regress_axislimit = { "xlimit": (regress_xmin, regress_xmax), "ylimit": (regress_ymin, regress_ymax), } if xunit != "": xlabel = "{} {} (${}$)".format(part1, xname_l, xunit) else: xlabel = "{} {}".format(part1, xname_l) if yunit != "": ylabel = "{} {} (${}$)".format(part2, yname_l, yunit) else: ylabel = "{} {}".format(part2, yname_l) regress_label = { "xlabel": xlabel, "ylabel": ylabel, "fontsize": 14, } if xname == "tbb": regress_locator = {"locator_x": (5, None), "locator_y": (5, 5)} elif xname == "ref": regress_locator = {"locator_x": (None, None), "locator_y": (None, 5)} elif xname == "dn": regress_locator = {"locator_x": (5, None), "locator_y": (None, 5)} else: regress_locator = None regress_annotate = { "left": ["{:10}: {:7.4f}".format("Slope", RadCompare[0]), "{:10}: {:7.4f}".format("Intercept", RadCompare[1]), "{:10}: {:7.4f}".format("Cor-Coef", RadCompare[4]), "{:10}: {:7d}".format("Number", length_rad)], "fontsize": 14, } regress_tick = {"fontsize": 14, } regress_diagonal = {"line_color": "#808080", "line_width": 1.2} regress_regressline = {"line_color": "r", "line_width": 1.2} scatter_point = {"scatter_alpha": 0.8} dv_pub_3d_dev.draw_regression( ax1, x, y, label=regress_label, ax_annotate=regress_annotate, tick=regress_tick, axislimit=regress_axislimit, locator=regress_locator, diagonal=regress_diagonal, regressline=regress_regressline, scatter_point=scatter_point, ) elif is_monthly: o_file = o_file + "_density" fig = plt.figure(figsize=(4.5, 4.5)) # fig.subplots_adjust(bottom=0.12, top=0.86) ax1 = plt.subplot2grid((1, 1), (0, 0)) # 图片 Title Label titleName = "%s-%s" % (xname.upper(), yname.upper()) title = "{} Regression {} Days\n{}_{} {} {}".format( titleName, num_file, part1, part2, chan, ymd) # 画密度图 ----------------------------------------------------- print "draw density" density_xmin = xmin density_xmax = xmax density_ymin = ymin density_ymax = ymax density_axislimit = { "xlimit": (density_xmin, density_xmax), "ylimit": (density_ymin, density_ymax), } if xunit != "": xlabel = "{} {} (${}$)".format(part1, xname_l, xunit) else: xlabel = "{} {}".format(part1, xname_l) if yunit != "": ylabel = "{} {} (${}$)".format(part2, yname_l, yunit) else: ylabel = "{} {}".format(part2, yname_l) density_label = { "xlabel": xlabel, "ylabel": ylabel, "fontsize": 14, } if xname == "tbb": density_locator = {"locator_x": (5, None), "locator_y": (5, 5)} elif xname == "ref": density_locator = {"locator_x": (None, None), "locator_y": (None, 5)} elif xname == "dn": density_locator = {"locator_x": (5, None), "locator_y": (None, 5)} else: density_locator = None density_annotate = { "left": ["{:10}: {:7.4f}".format("Slope", RadCompare[0]), "{:10}: {:7.4f}".format("Intercept", RadCompare[1]), "{:10}: {:7.4f}".format("Cor-Coef", RadCompare[4]), "{:10}: {:7d}".format("Number", length_rad)], "fontsize": 14, } density_tick = {"fontsize": 14, } density_diagonal = {"line_color": "#808080", "line_width": 1.2} density_regressline = {"line_color": "r", "line_width": 1.2} density = { "size": 5, "marker": "o", "alpha": 1 } dv_pub_3d_dev.draw_regression( ax1, x, y, label=density_label, ax_annotate=density_annotate, tick=density_tick, axislimit=density_axislimit, locator=density_locator, diagonal=density_diagonal, regressline=density_regressline, density=density, ) else: print "::::::No output Pic {} : ".format(ymd) return # 自动调整子图间距 plt.tight_layout() if not is_monthly and is_diagonal: fig.subplots_adjust(top=0.90) elif not is_monthly and not is_diagonal: fig.subplots_adjust(bottom=0.12, top=0.86) elif is_monthly: fig.subplots_adjust(bottom=0.12, top=0.86) FONT1.set_size(14) fig.suptitle(title, fontsize=14, fontproperties=FONT1) pb_io.make_sure_path_exists(os.path.dirname(o_file)) fig.savefig(o_file, dpi=100) print o_file + ".png" print "-" * 100 fig.clear() plt.close() return [len(x), RadCompare[0], RadCompare[1], RadCompare[4]], bias_and_md # num, a, b, r, bias and md
def draw_butterfly(sat1Nm, sat2Nm, ymd_s, ymd_e, lons, lats, out_fig_file, map_range): """ 画 FY3X 匹配蝴蝶图 """ if len(lons) == 0: return plt.style.use(os.path.join(dvPath, 'dv_pub_map.mplstyle')) # COLORS = ['#4cd964', '#1abc9c', '#5ac8fa', '#007aff', '#5856d6'] COLORS = [RED] if map_range[0] and map_range[1]: fig = plt.figure(figsize=(8, 10), dpi=100) # china plt.subplots_adjust(left=0.09, right=0.93, bottom=0.12, top=0.94) ax1 = plt.subplot2grid((2, 2), (0, 0)) ax2 = plt.subplot2grid((2, 2), (0, 1)) ax3 = plt.subplot2grid((2, 2), (1, 0), colspan=2) # 画两极 polar_range = map_range[0] # 两极范围 m = drawFig_map(ax1, "north", polar_range) plot_matchpoint(m, lons, lats, COLORS[0]) m = drawFig_map(ax2, "south", polar_range) plot_matchpoint(m, lons, lats, COLORS[0]) # 画区域 area_range = map_range[1] # 区域范围 m = drawFig_map(ax3, "area", area_range) plot_matchpoint(m, lons, lats, COLORS[0]) elif map_range[0]: fig = plt.figure(figsize=(8, 5), dpi=100) # china plt.subplots_adjust(left=0.09, right=0.93, bottom=0.12, top=0.94) ax1 = plt.subplot2grid((1, 2), (0, 0)) ax2 = plt.subplot2grid((1, 2), (0, 1)) # 画两极 polar_range = map_range[0] # 两极范围 m = drawFig_map(ax1, "north", polar_range) plot_matchpoint(m, lons, lats, COLORS[0]) m = drawFig_map(ax2, "south", polar_range) plot_matchpoint(m, lons, lats, COLORS[0]) elif map_range[1]: fig = plt.figure(figsize=(8, 5), dpi=100) # china plt.subplots_adjust(left=0.09, right=0.93, bottom=0.12, top=0.94) ax3 = plt.subplot2grid((1, 2), (0, 0), colspan=2) # 画区域 area_range = map_range[1] # 区域范围 m = drawFig_map(ax3, "area", area_range) plot_matchpoint(m, lons, lats, COLORS[0]) # ---------legend----------- # 对整张图片添加文字 TEXT_Y = 0.05 fig.text(0.1, TEXT_Y, '%s' % sat1Nm, color=RED, fontproperties=FONT0) if ymd_s != ymd_e: fig.text(0.55, TEXT_Y, '%s-%s' % (ymd_s, ymd_e), fontproperties=FONT0) else: fig.text(0.55, TEXT_Y, '%s' % ymd_s, fontproperties=FONT0) fig.text(0.83, TEXT_Y, ORG_NAME, fontproperties=FONT0) pb_io.make_sure_path_exists(os.path.dirname(out_fig_file)) fig.savefig(out_fig_file, dpi=100) print out_fig_file print '-' * 50 plt.close() fig.clear()
def plot(x, y, weight, picPath, part1, part2, chan, ym, DayOrNight, reference_list, xname, xname_l, xunit, xmin, xmax): """ x: 参考卫星传感器数据 y: FY数据 """ plt.style.use(os.path.join(dvPath, 'dv_pub_regression.mplstyle')) if xname_l == "TBB": xname_l = "TB" # 过滤 正负 delta+8倍std 的杂点 ------------ w = 1.0 / weight if weight is not None else None RadCompare = G_reg1d(x, y, w) reg_line = x * RadCompare[0] + RadCompare[1] delta = np.abs(y - reg_line) mean_delta = np.mean(delta) std_delta = np.std(delta) max_y = reg_line + mean_delta + std_delta * 8 min_y = reg_line - mean_delta - std_delta * 8 idx = np.logical_and(y < max_y, y > min_y) x = x[idx] y = y[idx] w = w[idx] if weight is not None else None # ----------------------------------------- if xname == "tbb": step = 5 else: step = 0.1 # 计算回归信息: 斜率,截距,R RadCompare = G_reg1d(x, y, w) # 开始绘图 fig = plt.figure(figsize=(6, 5)) ax1 = plt.subplot2grid((2, 1), (0, 0)) ax2 = plt.subplot2grid((2, 1), (1, 0)) # 图片 Title title = '%s Bias Monthly Statistics\n%s Minus %s %s %s' % \ (xname_l, part1, part2, chan, DayOrNight) # plot 偏差分布图 ------------------------------------------------- # x y 轴范围 distri_xmin = xmin distri_xmax = xmax if xname == "tbb": distri_ymin = -4 distri_ymax = 4 elif xname == "ref": distri_ymin = -0.08 distri_ymax = 0.08 else: distri_ymin = None distri_ymax = None distri_limit = { "xlimit": (distri_xmin, distri_xmax), "ylimit": (distri_ymin, distri_ymax), } distri_locator = { "locator_x": (None, None), "locator_y": (8, 5) } # Distri label distri_label = {} if xunit != "": ylabel = 'D{}({})'.format(xname_l, xunit) else: ylabel = "D{}".format(xname_l) distri_label["ylabel"] = ylabel ref_temp = reference_list[0] # 获取拟合系数 # 获取 MeanBias 信息 bias_range = 0.15 boundary = xmin + (xmax - xmin) * 0.15 bias_info = bias_information(x, y, boundary, bias_range) # 绝对偏差和相对偏差信息 TBB=250K REF=0.25 ab = RadCompare a = ab[0] b = ab[1] if xname == 'tbb': bias_info_md = "TBB Bias ({} K) : {:.4f} K".format( ref_temp, ref_temp - (ref_temp * a + b)) elif xname == 'ref': bias_info_md = "Relative Bias (REF {}) : {:.4f} %".format( ref_temp, (ref_temp - (ref_temp * a + b)) / ref_temp * 100) else: bias_info_md = "" # 配置注释信息 distri_annotate = {"left": [bias_info.get("info_lower"), bias_info.get("info_greater"), bias_info_md]} # 注释线配置 if xname == "tbb": avxline = { 'line_x': ref_temp, 'line_color': '#4cd964', 'line_width': 0.7, 'word': str(ref_temp) + xunit, 'word_color': EDGE_GRAY, 'word_size': 6, 'word_location': (ref_temp, -3.5) } elif xname == "ref": avxline = { 'line_x': ref_temp, 'line_color': '#4cd964', 'line_width': 0.7, 'word': str(ref_temp) + xunit, 'word_color': EDGE_GRAY, 'word_size': 6, 'word_location': (ref_temp, -0.07) } else: avxline = None distri_annotate = None # y=0 线配置 zeroline = {"line_color": '#808080', "line_width": 1.0} # 偏差点配置 scatter_delta = { "scatter_marker": 'o', "scatter_size": 1.5, "scatter_alpha": 0.5, "scatter_linewidth": 0, "scatter_zorder": 100, "scatter_color": BLUE, } # 偏差 fill 配置 background_fill = { "fill_marker": 'o-', "fill_size": 6, "fill_alpha": 0.5, "fill_linewidth": 0.6, "fill_zorder": 50, "fill_color": RED, "fill_step": step, } dv_pub_3d_dev.draw_distribution(ax1, x, y, label=distri_label, ax_annotate=distri_annotate, axislimit=distri_limit, locator=distri_locator, zeroline=zeroline, scatter_delta=scatter_delta, avxline=avxline, background_fill=background_fill, ) # 绘制 Bar 图 ------------------------------------------------- bar_xmin = distri_xmin bar_xmax = distri_xmax bar_ymin = 0 bar_ymax = 7 bar_limit = { "xlimit": (bar_xmin, bar_xmax), "ylimit": (bar_ymin, bar_ymax), } if xname == "tbb": bar_locator = { "locator_x": (None, None), "locator_y": (7, 5) } elif xname == "ref": bar_locator = { "locator_x": (None, None), "locator_y": (7, 5) } else: bar_locator = None # bar 的宽度 if xname == "tbb": width = 3 elif xname == "ref": width = 0.07 else: width = 1 # bar 配置 bar = { "bar_width": width, "bar_color": BLUE, "bar_linewidth": 0, "text_size": 6, "text_font": FONT_MONO, "bar_step": step, } bar_annotate = { "left": ['Total Number: %7d' % len(x)] } bar_label = { "xlabel": '%s %s' % (part2, xname_l) + ( '($%s$)' % xunit if xunit != "" else ""), "ylabel": 'Number of sample points\nlog (base = 10)' } dv_pub_3d_dev.draw_bar(ax2, x, y, label=bar_label, ax_annotate=bar_annotate, axislimit=bar_limit, locator=bar_locator, bar=bar, ) # --------------- plt.tight_layout() # 将 ax1 的 xticklabels 设置为不可见 plt.setp(ax1.get_xticklabels(), visible=False) # 子图的底间距 fig.subplots_adjust(bottom=0.16, top=0.90) FONT1.set_size(11) fig.suptitle(title, fontsize=11, fontproperties=FONT1) fig.text(0.6, 0.02, '%s' % ym, fontsize=11, fontproperties=FONT0) fig.text(0.8, 0.02, ORG_NAME, fontsize=11, fontproperties=FONT0) # --------------- pb_io.make_sure_path_exists(os.path.dirname(picPath)) fig.savefig(picPath) print picPath plt.close() fig.clear()
def plot_rmd( date_d, data_d, date_m, data_m, std_m, pic_path, date_s, date_e, sat_name, pair, chan, day_or_night, ref_temp, xname, xname_l, xunit, yname, yname_l, yunit, ): if (np.isnan(data_d)).all(): Log.error('Everything is NaN: %s' % pic_path) return plt.style.use(os.path.join(dvPath, 'dv_pub_timeseries.mplstyle')) fig = plt.figure(figsize=(6, 4)) # fig.subplots_adjust(top=0.88, bottom=0.11, left=0.12, right=0.97) ax1 = plt.subplot2grid((1, 1), (0, 0)) # 设置 title 参数 part1, part2 = pair.split('_') title = 'Time Series of REF Relative Bias \n{} Minus {} {} {} REF={}'.format( part1, part2, chan, day_or_night, ref_temp) # plot timeseries -------------------------------------------------------- timeseries_xmin = pb_time.ymd2date('%04d%02d01' % (date_s.year, date_s.month)) timeseries_xmax = date_e if "FY2" in sat_name: timeseries_ymin = -20 timeseries_ymax = 20 elif "FY3" in sat_name: timeseries_ymin = -20 timeseries_ymax = 20 elif "FY4" in sat_name: timeseries_ymin = -20 timeseries_ymax = 20 else: timeseries_ymin = None timeseries_ymax = None timeseries_axislimit = { "xlimit": (timeseries_xmin, timeseries_xmax), "ylimit": (timeseries_ymin, timeseries_ymax), } # x y 轴标签 timeseries_label = {} if xunit != "": ylabel = 'Relative Bias {}'.format(xunit) else: ylabel = "Relative Bias %" timeseries_label["ylabel"] = ylabel # x, y 轴大刻度的数量,和小刻度的数量 timeseries_locator = {"locator_x": (None, None), "locator_y": (8, 2)} # y=0 线配置 timeseries_zeroline = {"line_color": '#808080', "line_width": 1.0} timeseries_daily = { "marker": 'x', "color": BLUE, "linewidth": None, "markersize": 6, "markerfacecolor": None, "markeredgecolor": BLUE, "alpha": 0.8, "markeredgewidth": 0.3, "label": "Daily", } dv_pub_3d_dev.draw_timeseries( ax1, date_d, data_d, label=timeseries_label, axislimit=timeseries_axislimit, locator=timeseries_locator, zeroline=timeseries_zeroline, timeseries=timeseries_daily, ) timeseries_monthly = { "marker": 'o-', "color": RED, "linewidth": 0.6, "markersize": 5, "markerfacecolor": None, "markeredgecolor": RED, "alpha": 0.8, "markeredgewidth": 0, "label": "Monthly", } background_fill_timeseries = { 'x': date_m, 'y': data_m - std_m, 'y1': data_m + std_m, "color": RED, } dv_pub_3d_dev.draw_timeseries( ax1, date_m, data_m, label=timeseries_label, axislimit=timeseries_axislimit, locator=timeseries_locator, zeroline=timeseries_zeroline, timeseries=timeseries_monthly, background_fill=background_fill_timeseries, ) # -------------------- plt.tight_layout() fig.suptitle(title, fontsize=11, fontproperties=FONT0) fig.subplots_adjust(bottom=0.2, top=0.88) circle1 = mpatches.Circle((74, 15), 6, color=BLUE, ec=EDGE_GRAY, lw=0) circle2 = mpatches.Circle((164, 15), 6, color=RED, ec=EDGE_GRAY, lw=0) fig.patches.extend([circle1, circle2]) fig.text(0.15, 0.02, 'Daily', color=BLUE, fontproperties=FONT0) fig.text(0.3, 0.02, 'Monthly', color=RED, fontproperties=FONT0) ymd_s, ymd_e = date_s.strftime('%Y%m%d'), date_e.strftime('%Y%m%d') if ymd_s != ymd_e: fig.text(0.50, 0.02, '%s-%s' % (ymd_s, ymd_e), fontproperties=FONT0) else: fig.text(0.50, 0.02, '%s' % ymd_s, fontproperties=FONT0) fig.text(0.8, 0.02, ORG_NAME, fontproperties=FONT0) # --------------- pb_io.make_sure_path_exists(os.path.dirname(pic_path)) plt.savefig(pic_path) print pic_path fig.clear() plt.close()