From 0a8de9da0a3bbe32b8c150be20b5af24e1efc068 Mon Sep 17 00:00:00 2001 From: fy3047957834 <3047957834@qq.com> Date: Sun, 24 Oct 2021 20:18:03 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AD=97=E4=BD=93=E5=A4=A7=E5=B0=8F=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=EF=BC=8C=E9=97=AE=E9=A2=98=E5=9B=BE=E5=88=A0=E9=99=A4?= =?UTF-8?q?=EF=BC=8C=E7=AC=AC=E4=B8=80=E7=89=88logo=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Bug.docx | Bin 13767 -> 13066 bytes chart/charts.py | 417 ++---------------- chart/tools.py | 7 +- db.sqlite3 | Bin 745472 -> 745472 bytes static/logo改_3.png | Bin 0 -> 20512 bytes templates/page/about.html | 2 +- templates/page/index.html | 2 +- templates/page/tools.html | 17 +- .../Differential_expression_analysis.html | 2 +- templates/tools/blast.html | 8 +- templates/tools/fastqc.html | 2 +- templates/tools/orf.html | 4 +- templates/tools/pfam.html | 12 +- 13 files changed, 73 insertions(+), 400 deletions(-) create mode 100644 static/logo改_3.png diff --git a/Bug.docx b/Bug.docx index c0a1edd87187d69d76333ae227572c9a5ac5a24a..85e3569e4b7db25f4d9dd7b5b1ddfd5f2bc1b1db 100644 GIT binary patch delta 3904 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 delta 4616 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 diff --git a/chart/charts.py b/chart/charts.py index e86ffdf..937753e 100644 --- a/chart/charts.py +++ b/chart/charts.py @@ -752,55 +752,6 @@ def Stacked_Histogram_for_Continuous_Variable(file_path, chart_out_path, out_pat plt.savefig(f"{out_path}.pdf") -# 23、密度图(Density_Plot) -# 测试文件 mpg.csv -# 基础参数 图片的长/宽/分辨率/字号/x轴字号/标题的字号、xy轴限制/颜色 - -def Density_Plot(file_path, chart_out_path, x_scale_font_angle, y_scale_font_angle, y_name, x_name, y_font_size, - x_font_size, out_path, - scale_font_size, title, title_font_size, column_name): - df = pd.read_csv(file_path) - - # Draw Plot - plt.figure(figsize=(9.4, 4.25), dpi=180) - sns.kdeplot(df.loc[df[column_name] == 4, column_name], - shade=True, - color="#01a2d9", - label=f"{column_name}=4", - alpha=.7) - sns.kdeplot(df.loc[df[column_name] == 5, column_name], - shade=True, - color="#dc2624", - label=f"{column_name}=5", - alpha=.7) - sns.kdeplot(df.loc[df[column_name] == 6, column_name], - shade=True, - color="#C89F91", - label=f"{column_name}=6", - alpha=.7) - sns.kdeplot(df.loc[df[column_name] == 8, column_name], - shade=True, - color="#649E7D", - label=f"{column_name}=8", - alpha=.7) - - # Decoration - sns.set(style="whitegrid", font_scale=scale_font_size) - plt.title(title, fontsize=title_font_size) - plt.legend() - - plt.xticks(rotation=x_scale_font_angle, fontsize=10) - plt.yticks(rotation=y_scale_font_angle, fontsize=10) - - plt.ylabel(y_name, fontsize=y_font_size) - plt.ylabel(x_name, fontsize=x_font_size) - - plt.savefig(f"{chart_out_path}") # 保存图片 - plt.savefig(f"{out_path}.png") - plt.savefig(f"{out_path}.svg") - plt.savefig(f"{out_path}.pdf") - - # 25、山峰叠峦图(Joy_Plot) # 测试文件 mpg.csv # 基础参数 图片的长/宽/分辨率/字号/x轴字号/标题的字号、xy轴限制/颜色 @@ -834,103 +785,7 @@ def Joy_Plot(file_path, chart_out_path, out_path, title, title_font_size, x_scal plt.savefig(f"{out_path}.pdf") -# 27、箱图(boxplot) - -# 测试文件 mpg.csv -# 基础参数 图片的长/宽/分辨率/字号/x轴字号/标题的字号、xy轴限制/颜色 - -def boxplot(file_path, chart_out_path, out_path, - scale_font_size, title, title_font_size, font_size, font_color, y_scale_min, y_scale_max, x_column_name, - y_column_name, x_scale_font_angle, y_scale_font_angle, y_name, x_name, color): - df = pd.read_csv(file_path) - # Draw Plot - plt.figure(figsize=(9.4, 4.25), dpi=180) - sns.boxplot( - x=x_column_name, - y=y_column_name, - data=df, - notch=False, - palette=color, - ) - - # Add N Obs inside boxplot (optional) - - plt.xticks(rotation=x_scale_font_angle, fontsize=10) - plt.yticks(rotation=y_scale_font_angle, fontsize=10) - - plt.ylabel(y_name, fontsize=12) - plt.ylabel(x_name, fontsize=12) - - def add_n_obs(df, group_col, y): - medians_dict = { - grp[0]: grp[1][y].median() - for grp in df.groupby(group_col) - } - xticklabels = [x.get_text() for x in plt.gca().get_xticklabels()] - n_obs = df.groupby(group_col)[y].size().values - for (x, xticklabel), n_ob in zip(enumerate(xticklabels), n_obs): - plt.text(x, - medians_dict[xticklabel] * 1.01, - "#obs : " + str(n_ob), - horizontalalignment='center', - fontdict={'size': font_size}, - color=font_color) - - add_n_obs(df, group_col=x_column_name, y=y_column_name) - - # Decoration - sns.set(style="whitegrid", font_scale=scale_font_size) - plt.title(title, fontsize=title_font_size) - plt.ylim(y_scale_min, y_scale_max) - plt.savefig(f"{chart_out_path}") # 保存图片 - plt.savefig(f"{out_path}.png") - plt.savefig(f"{out_path}.svg") - plt.savefig(f"{out_path}.pdf") - - -# 28、箱图结合点图(Dot_Box_Plot) -# 测试文件 mpg.csv - - -def Dot_Box_Plot(file_path, chart_out_path, out_path, - title, title_font_size, point_size, line_color, x_scale_font_angle, y_scale_font_angle, y_name, x_name, - x_column_name, y_column_name, group_by_column, legend_name, color): - df = pd.read_csv(file_path) - plt.figure(figsize=(9.4, 4.25), dpi=180) - sns.boxplot( - x=x_column_name, - y=y_column_name, - data=df, - hue=legend_name, - palette=color, - ) - - plt.xticks(rotation=x_scale_font_angle, fontsize=10) - plt.yticks(rotation=y_scale_font_angle, fontsize=10) - - plt.ylabel(y_name, fontsize=12) - plt.ylabel(x_name, fontsize=12) - - plt.legend(loc=9) - sns.stripplot(x=x_column_name, - y=y_column_name, - data=df, - color='#dc2624', - size=point_size, - jitter=1) - - for i in range(len(df[group_by_column].unique()) - 1): - plt.vlines(i + .5, 10, 45, linestyles='solid', colors=line_color, alpha=0.2) - - # Decoration - plt.title(title, fontsize=title_font_size) - plt.savefig(f"{chart_out_path}") # 保存图片 - plt.savefig(f"{out_path}.png") - plt.savefig(f"{out_path}.svg") - plt.savefig(f"{out_path}.pdf") - - -# 28、箱图结合点图(Dot_Box_Plot) +# 28、箱图结合点图(Violin_Plot) # 测试文件 mpg.csv @@ -1007,58 +862,6 @@ def Population_Pyramid(file_path, chart_out_path, out_path, plt.savefig(f"{out_path}.pdf") -# 32、华夫饼图(Waffle_Chart) - -# 测试文件 mpg.csv - - -def Waffle_Chart(file_path, chart_out_path, out_path, rows_number, group_by_column, x_scale_font_angle, - y_scale_font_angle, y_name, x_name, - title_font_size, title): - df_raw = pd.read_csv(file_path) - - from pywaffle import Waffle - - # Prepare Data - df = df_raw.groupby(group_by_column).size().reset_index(name='counts') - n_categories = df.shape[0] - colors = [plt.cm.Set1(i / float(n_categories)) - for i in range(n_categories)] - - # Draw Plot and Decorate - plt.figure(FigureClass=Waffle, - plots={ - '111': { - 'values': - df['counts'], - 'labels': [ - "{0} ({1})".format(n[0], n[1]) - for n in df[[group_by_column, 'counts']].itertuples() - ], - 'legend': { - 'loc': 'upper left', - 'bbox_to_anchor': (1.05, 1), - 'fontsize': 12 - }, - }, - }, - rows=rows_number, - colors=colors, - dpi=180, - figsize=(9.4, 4.25)) - - plt.xticks(rotation=x_scale_font_angle, fontsize=10) - plt.yticks(rotation=y_scale_font_angle, fontsize=10) - plt.title(title, fontsize=title_font_size) - plt.ylabel(y_name, fontsize=12) - plt.ylabel(x_name, fontsize=12) - - plt.savefig(f"{chart_out_path}") # 保存图片 - plt.savefig(f"{out_path}.png") - plt.savefig(f"{out_path}.svg") - plt.savefig(f"{out_path}.pdf") - - # 33、饼图(Pie_Chart) # 测试文件 mpg.csv @@ -1110,177 +913,6 @@ def Treemap(file_path, chart_out_path, out_path, title, group_by_column, title_f plt.savefig(f"{out_path}.pdf") -# 35、柱状图(Bar_Chart -# 测试文件 mpg.csv - - -def Bar_Chart(file_path, chart_out_path, out_path, title, title_font_size, font_size, y_scale_min, y_scale_max, width, - group_by_column, x_scale_font_angle, - y_scale_font_angle, y_name, x_name): - import random - df_raw = pd.read_csv(file_path) - - df = df_raw.groupby(group_by_column).size().reset_index(name='counts') - n = df[group_by_column].unique().__len__() + 1 - all_colors = list(plt.cm.colors.cnames.keys()) - random.seed(100) - c = random.choices(all_colors, k=n) - - # Plot Bars - plt.figure(figsize=(9.4, 4.25), dpi=180) - plt.bar(df[group_by_column], df['counts'], color=c, width=width) - for i, val in enumerate(df['counts'].values): - plt.text(i, - val, - float(val), - horizontalalignment='center', - verticalalignment='bottom', - fontdict={ - 'fontweight': 500, - 'size': font_size - }) - - # Decoration - plt.gca().set_xticklabels(df[group_by_column], - rotation=60, - horizontalalignment='right') - plt.title(title, fontsize=title_font_size) - - plt.xticks(rotation=x_scale_font_angle, fontsize=10) - plt.yticks(rotation=y_scale_font_angle, fontsize=10) - - plt.ylabel(y_name, fontsize=12) - plt.ylabel(x_name, fontsize=12) - - plt.ylim(y_scale_min, y_scale_max) - plt.savefig(f"{chart_out_path}") # 保存图片 - plt.savefig(f"{out_path}.png") - plt.savefig(f"{out_path}.svg") - plt.savefig(f"{out_path}.pdf") - - -# 36、时间序列图(Time_Series_Plot) -# 测试文件 AirPassengers.csv - - -def Time_Series_Plot(file_path, chart_out_path, out_path, - polt_color, title, title_font_size, x_column, y_column, x_font_size, y_font_size, y_scale_min, - y_scale_max, x_scale_font_angle, - y_scale_font_angle, y_name, x_name): - df = pd.read_csv(file_path) - - # Draw Plot - plt.figure(figsize=(9.4, 4.25), dpi=180) - plt.plot(df[x_column], df[y_column], color=polt_color) - # plt.plot(df['date'], df['value'], color='#365770') - # print(file_path) - # Decoration - plt.ylim(y_scale_min, y_scale_max) - xtick_location = df.index.tolist()[::12] - xtick_labels = [x[-4:] for x in df.date.tolist()[::12]] - plt.xticks(ticks=xtick_location, - labels=xtick_labels, - rotation=0, - fontsize=x_font_size, - horizontalalignment='center', - alpha=.7) - plt.yticks(fontsize=y_font_size, alpha=.7) - plt.title(title, fontsize=title_font_size) - plt.grid(axis='both', alpha=.3) - plt.show() - plt.xticks(rotation=x_scale_font_angle, fontsize=10) - plt.yticks(rotation=y_scale_font_angle, fontsize=10) - - plt.ylabel(y_name, fontsize=12) - plt.ylabel(x_name, fontsize=12) - - # Remove borders - plt.gca().spines["top"].set_alpha(0.0) - plt.gca().spines["bottom"].set_alpha(0.3) - plt.gca().spines["right"].set_alpha(0.0) - plt.gca().spines["left"].set_alpha(0.3) - - plt.savefig(f"{chart_out_path}") # 保存图片 - plt.savefig(f"{out_path}.png") - plt.savefig(f"{out_path}.svg") - plt.savefig(f"{out_path}.pdf") - - -# 41、多重时间序列图(Multiple_Time_Series)!!! -# 测试文件 mortality.csv - -def Multiple_Time_Series(file_path, chart_out_path, out_path, - font_size, title, title_font_size, x_font_size, y_font_size, x_scale_min, x_scale_max, - x_scale_font_angle, y_scale_font_angle, y_name, - x_name): - df = pd.read_csv(file_path) - - y_LL = 100 - y_UL = int(df.iloc[:, 1:].max().max() * 1.1) - y_interval = 400 - mycolors = ['tab:red', 'tab:blue', 'tab:green', 'tab:orange'] - - fig, ax = plt.subplots(1, 1, figsize=(9.4, 4.25), dpi=180) - - columns = df.columns[1:] - for i, column in enumerate(columns): - plt.plot(df.date.values, df[column].values, lw=1.5, color=mycolors[i]) - plt.text(df.shape[0] + 1, - df[column].values[-1], - column, - fontsize=font_size, - color=mycolors[i]) - - for y in range(y_LL, y_UL, y_interval): - plt.hlines(y, - xmin=0, - xmax=71, - colors='black', - alpha=0.3, - linestyles="--", - lw=0.5) - - # Decorations - plt.tick_params(axis="both", - which="both", - bottom=False, - top=False, - labelbottom=True, - left=False, - right=False, - labelleft=True) - - # Lighten borders - plt.gca().spines["top"].set_alpha(.3) - plt.gca().spines["bottom"].set_alpha(.3) - plt.gca().spines["right"].set_alpha(.3) - plt.gca().spines["left"].set_alpha(.3) - - plt.title(title, - fontsize=title_font_size) - plt.yticks(range(y_LL, y_UL, y_interval), - [str(y) for y in range(y_LL, y_UL, y_interval)], - fontsize=y_font_size) - plt.xticks(range(0, df.shape[0], 12), - df.date.values[::12], - horizontalalignment='left', - rotation=45, - fontsize=x_font_size) - plt.ylim(y_LL, y_UL) - plt.xlim(x_scale_min, x_scale_max) - - plt.xticks(rotation=x_scale_font_angle, fontsize=10) - plt.yticks(rotation=y_scale_font_angle, fontsize=10) - - plt.ylabel(y_name, fontsize=12) - plt.ylabel(x_name, fontsize=12) - - plt.savefig(f"{chart_out_path}") # 保存图片 - plt.savefig(f"{out_path}.png") - plt.savefig(f"{out_path}.svg") - plt.savefig(f"{out_path}.pdf") - - # 42、双坐标系时间序列图(Plotting_with_different_scales_using_secondary_Y_axis) # 测试文件 economics.csv @@ -1541,6 +1173,7 @@ dev.off() keep_txt_to_file(code, f"{out_path}.R") os.system(f"Rscript {out_path}.R") + os.remove(f"{out_path}.R") def Composition_BarOfColorsDataByGroup(file_path, chart_out_path, out_path, title, caption, subtitle, x_name, y_name, @@ -1598,6 +1231,7 @@ dev.off() keep_txt_to_file(code, f"{out_path}.R") os.system(f"Rscript {out_path}.R") + os.remove(f"{out_path}.R") # 高级参数 x_font_color, y_font_color, x_scale_font_color, y_scale_font_color, title_font_color, legend_name, legend_position @@ -1658,6 +1292,7 @@ dev.off() keep_txt_to_file(code, f"{out_path}.R") os.system(f"Rscript {out_path}.R") + os.remove(f"{out_path}.R") # 高级参数 x_font_color, y_font_color, x_scale_font_color, y_scale_font_color, title_font_color, legend_name, legend_position @@ -1722,6 +1357,7 @@ dev.off() keep_txt_to_file(code, f"{out_path}.R") os.system(f"Rscript {out_path}.R") + os.remove(f"{out_path}.R") # 高级参数 x_font_color, y_font_color, x_scale_font_color, y_scale_font_color, title_font_color, model2, model3, model4, model5 @@ -1804,6 +1440,7 @@ dev.off() keep_txt_to_file(code, f"{out_path}.R") os.system(f"Rscript {out_path}.R") + os.remove(f"{out_path}.R") # 高级参数 x_font_color, y_font_color, x_scale_font_color, y_scale_font_color, title_font_color @@ -1863,6 +1500,7 @@ dev.off() keep_txt_to_file(code, f"{out_path}.R") os.system(f"Rscript {out_path}.R") + os.remove(f"{out_path}.R") # 高级参数 x_font_color, y_font_color, x_scale_font_color, y_scale_font_color, title_font_color @@ -1919,6 +1557,7 @@ dev.off() keep_txt_to_file(code, f"{out_path}.R") os.system(f"Rscript {out_path}.R") + os.remove(f"{out_path}.R") # 高级参数 x_font_color, y_font_color, x_scale_font_color, y_scale_font_color, title_font_color @@ -1973,6 +1612,7 @@ dev.off() keep_txt_to_file(code, f"{out_path}.R") os.system(f"Rscript {out_path}.R") + os.remove(f"{out_path}.R") # 高级参数 x_font_color, y_font_color, x_scale_font_color, y_scale_font_color, title_font_color @@ -2030,6 +1670,7 @@ dev.off() keep_txt_to_file(code, f"{out_path}.R") os.system(f"Rscript {out_path}.R") + os.remove(f"{out_path}.R") # 高级参数 x_font_color, y_font_color, x_scale_font_color, y_scale_font_color, title_font_color @@ -2095,6 +1736,7 @@ dev.off() keep_txt_to_file(code, f"{out_path}.R") os.system(f"Rscript {out_path}.R") + os.remove(f"{out_path}.R") # 高级参数 x_font_color, y_font_color, x_scale_font_color, y_scale_font_color, title_font_color @@ -2157,6 +1799,7 @@ dev.off() keep_txt_to_file(code, f"{out_path}.R") os.system(f"Rscript {out_path}.R") + os.remove(f"{out_path}.R") # 高级参数 x_font_color, y_font_color, x_scale_font_color, y_scale_font_color, title_font_color @@ -2220,6 +1863,7 @@ dev.off() keep_txt_to_file(code, f"{out_path}.R") os.system(f"Rscript {out_path}.R") + os.remove(f"{out_path}.R") # 高级参数 x_font_color, y_font_color, x_scale_font_color, y_scale_font_color, title_font_color @@ -2282,6 +1926,7 @@ dev.off() keep_txt_to_file(code, f"{out_path}.R") os.system(f"Rscript {out_path}.R") + os.remove(f"{out_path}.R") # 高级参数 x_font_color, y_font_color, x_scale_font_color, y_scale_font_color, title_font_color @@ -2341,6 +1986,7 @@ dev.off() keep_txt_to_file(code, f"{out_path}.R") os.system(f"Rscript {out_path}.R") + os.remove(f"{out_path}.R") # 高级参数 x_font_color, y_font_color, x_scale_font_color, y_scale_font_color, title_font_color, legend_name, legend_position, line_color, point_color @@ -2406,6 +2052,7 @@ dev.off() keep_txt_to_file(code, f"{out_path}.R") os.system(f"Rscript {out_path}.R") + os.remove(f"{out_path}.R") # 高级参数 x_font_color, y_font_color, x_scale_font_color, y_scale_font_color, title_font_color, line_color @@ -2458,6 +2105,7 @@ dev.off() keep_txt_to_file(code, f"{out_path}.R") os.system(f"Rscript {out_path}.R") + os.remove(f"{out_path}.R") # 高级参数 x_font_color, y_font_color, x_scale_font_color, y_scale_font_color, title_font_color, legend_name, legend_position, line_color @@ -2518,6 +2166,7 @@ dev.off() keep_txt_to_file(code, f"{out_path}.R") os.system(f"Rscript {out_path}.R") + os.remove(f"{out_path}.R") # 高级参数 x_font_color, y_font_color, x_scale_font_color, y_scale_font_color, title_font_color, legend_name, legend_position, line_color @@ -2577,6 +2226,7 @@ dev.off() keep_txt_to_file(code, f"{out_path}.R") os.system(f"Rscript {out_path}.R") + os.remove(f"{out_path}.R") # 高级参数 x_font_color, y_font_color, x_scale_font_color, y_scale_font_color, title_font_color, legend_name, legend_position, model @@ -2651,6 +2301,7 @@ dev.off() keep_txt_to_file(code, f"{out_path}.R") os.system(f"Rscript {out_path}.R") + os.remove(f"{out_path}.R") # 高级参数 x_font_color, y_font_color, x_scale_font_color, y_scale_font_color, title_font_color, legend_name, legend_position @@ -2711,6 +2362,7 @@ dev.off() keep_txt_to_file(code, f"{out_path}.R") os.system(f"Rscript {out_path}.R") + os.remove(f"{out_path}.R") # 高级参数 x_font_color, y_font_color, x_scale_font_color, y_scale_font_color, title_font_color, legend_name, legend_position, color @@ -2777,6 +2429,7 @@ dev.off() keep_txt_to_file(code, f"{out_path}.R") os.system(f"Rscript {out_path}.R") + os.remove(f"{out_path}.R") # 高级参数 x_font_color, y_font_color, x_scale_font_color, y_scale_font_color, title_font_color, legend_name, legend_position, color @@ -2839,6 +2492,7 @@ dev.off() keep_txt_to_file(code, f"{out_path}.R") os.system(f"Rscript {out_path}.R") + os.remove(f"{out_path}.R") # 高级参数 x_font_color, y_font_color, x_scale_font_color, y_scale_font_color, title_font_color, legend_name, legend_position, line_color @@ -2897,6 +2551,7 @@ dev.off() keep_txt_to_file(code, f"{out_path}.R") os.system(f"Rscript {out_path}.R") + os.remove(f"{out_path}.R") # 基础参数 file_path, chart_out_path, out_path, title, caption, subtitle, title_font_size, @@ -2942,6 +2597,7 @@ dev.off() keep_txt_to_file(code, f"{out_path}.R") os.system(f"Rscript {out_path}.R") + os.remove(f"{out_path}.R") # 高级参数 x_font_color, y_font_color, x_scale_font_color, y_scale_font_color, title_font_color, legend_name, legend_position @@ -3008,6 +2664,7 @@ dev.off() keep_txt_to_file(code, f"{out_path}.R") os.system(f"Rscript {out_path}.R") + os.remove(f"{out_path}.R") # 高级参数 x_font_color, y_font_color, x_scale_font_color, y_scale_font_color, title_font_color, species_1, species_2 @@ -3091,6 +2748,7 @@ dev.off() keep_txt_to_file(code, f"{out_path}.R") os.system(f"Rscript {out_path}.R") + os.remove(f"{out_path}.R") # 高级参数 x_font_color, y_font_color, x_scale_font_color, y_scale_font_color, title_font_color, legend_name, legend_position @@ -3153,6 +2811,7 @@ dev.off() keep_txt_to_file(code, f"{out_path}.R") os.system(f"Rscript {out_path}.R") + os.remove(f"{out_path}.R") # 高级参数 x_font_color, y_font_color, x_scale_font_color, y_scale_font_color, title_font_color @@ -3213,6 +2872,7 @@ dev.off() keep_txt_to_file(code, f"{out_path}.R") os.system(f"Rscript {out_path}.R") + os.remove(f"{out_path}.R") # 高级参数 x_font_color, y_font_color, x_scale_font_color, y_scale_font_color, title_font_color @@ -3281,6 +2941,7 @@ dev.off() keep_txt_to_file(code, f"{out_path}.R") os.system(f"Rscript {out_path}.R") + os.remove(f"{out_path}.R") # 高级参数 x_font_color, y_font_color, x_scale_font_color, y_scale_font_color, title_font_color, legend_name, legend_position @@ -3362,6 +3023,7 @@ dev.off() keep_txt_to_file(code, f"{out_path}.R") os.system(f"Rscript {out_path}.R") + os.remove(f"{out_path}.R") # 高级参数 x_font_color, y_font_color, x_scale_font_color, y_scale_font_color, title_font_color @@ -3418,6 +3080,7 @@ dev.off() keep_txt_to_file(code, f"{out_path}.R") os.system(f"Rscript {out_path}.R") + os.remove(f"{out_path}.R") # 高级参数 x_font_color, y_font_color, x_scale_font_color, y_scale_font_color, title_font_color @@ -3475,6 +3138,7 @@ dev.off() keep_txt_to_file(code, f"{out_path}.R") os.system(f"Rscript {out_path}.R") + os.remove(f"{out_path}.R") # 高级参数 x_font_color, y_font_color, x_scale_font_color, y_scale_font_color, title_font_color @@ -3546,6 +3210,7 @@ dev.off() keep_txt_to_file(code, f"{out_path}.R") os.system(f"Rscript {out_path}.R") + os.remove(f"{out_path}.R") # 高级参数 x_font_color, y_font_color, x_scale_font_color, y_scale_font_color, title_font_color @@ -3600,6 +3265,7 @@ dev.off() keep_txt_to_file(code, f"{out_path}.R") os.system(f"Rscript {out_path}.R") + os.remove(f"{out_path}.R") # 高级参数 x_font_color, y_font_color, x_scale_font_color, y_scale_font_color, title_font_color @@ -3665,6 +3331,7 @@ dev.off() keep_txt_to_file(code, f"{out_path}.R") os.system(f"Rscript {out_path}.R") + os.remove(f"{out_path}.R") # 高级参数 x_font_color, y_font_color, x_scale_font_color, y_scale_font_color, title_font_color @@ -3729,6 +3396,7 @@ dev.off() """ keep_txt_to_file(code, f"{out_path}.R") os.system(f"Rscript {out_path}.R") + os.remove(f"{out_path}.R") # 最后一组 @@ -3862,6 +3530,7 @@ def Aggregated_Pyramids(file_path, char_out_path, out_path, title, caption, subt keep_txt_to_file(code, f"{out_path}.R") os.system(f"Rscript {out_path}.R") + os.remove(f"{out_path}.R") # 基础参数 file_path, char_out_path, out_path, title, caption, subtitle, title_font_size, x_name, x_font_size, x_scale_font_size, y_name, y_font_size, y_scale_font_size, event_1, event_2, event_3, font_size @@ -3989,6 +3658,7 @@ def Areas_Under_a_Time_Series(file_path, char_out_path, out_path, title, caption keep_txt_to_file(code, f"{out_path}.R") os.system(f"Rscript {out_path}.R") + os.remove(f"{out_path}.R") # 基础参数 file_path, char_out_path, out_path, title, caption_1, caption_2, subtitle, title_font_size, font_size @@ -4084,7 +3754,7 @@ def Balloon_Plot(file_path, char_out_path, out_path, title, caption_1, caption_2 keep_txt_to_file(code, f"{out_path}.R") os.system(f"Rscript {out_path}.R") # 基础参数 file_path, char_out_path, out_path, title, caption, subtitle, title_font_size, x_name, x_font_size, x_scale_font_size, y_name, y_font_size, y_scale_font_size, image_name_font_size, mark_country_1, mark_country_2, average_font_size - + os.remove(f"{out_path}.R") # 高级参数 title_font_color, x_font_color, x_scale_font_color, y_font_color, y_scale_font_color, image_name_font_color, average_font_color, mark_color, color @@ -4787,8 +4457,8 @@ def Comparison_with_Bar_Chart_1(file_path, char_out_path, out_path, title, capti """ keep_txt_to_file(code, f"{out_path}.R") - os.system( - f"Rscript {out_path}.R") # 基础参数 file_path, char_out_path, out_path, title, caption, subtitle, title_font_size, x_name, x_font_size, x_scale_font_size, y_scale_font_size, ruler_name, max_number_size, ruler_name_font_size, ruler_number_font_size, country_1, country_2, country_3, country_1_time_1, country_1_time_2, country_2_time_1, country_2_time_2, country_3_time_1, country_3_time_2 + os.system(f"Rscript {out_path}.R") # 基础参数 file_path, char_out_path, out_path, title, caption, subtitle, title_font_size, x_name, x_font_size, x_scale_font_size, y_scale_font_size, ruler_name, max_number_size, ruler_name_font_size, ruler_number_font_size, country_1, country_2, country_3, country_1_time_1, country_1_time_2, country_2_time_1, country_2_time_2, country_3_time_1, country_3_time_2 + os.remove(f"{out_path}.R") # 高级参数 title_font_color, x_font_color, x_scale_font_color, ruler_color, y_scale_font_color, zero_graduation_color, color_1, color_2, max_number_font_color, ruler_number_font_color @@ -7558,4 +7228,5 @@ def chord_Diagram(file_path, file_path_2, char_out_path, out_path, title, captio """ keep_txt_to_file(code, f"{out_path}.R") - os.system(f"Rscript {out_path}.R") \ No newline at end of file + os.system(f"Rscript {out_path}.R") + os.remove(f"{out_path}.R") \ No newline at end of file diff --git a/chart/tools.py b/chart/tools.py index 7c91a4f..7bebac3 100644 --- a/chart/tools.py +++ b/chart/tools.py @@ -357,13 +357,16 @@ class="layui-input" style="height: 25px; width:80px;margin-top: 6px"> def color_js(self): code = "" + init_color = "" for i in self.colors_dict.keys(): if self.colors_dict[i] == "rgb": fl = "rgb" + init_color = "rgb(0,0,0)" else: fl = "hex" + init_color = "#000000" code += """ - %s = "#000000" + %s = "%s" layui.use('colorpicker', function() { var $ = layui.$ @@ -381,7 +384,7 @@ class="layui-input" style="height: 25px; width:80px;margin-top: 6px"> }); }) - """ % (i + '_', i, random_color(), fl, i + "_") + """ % (i + '_', init_color, i, random_color(), fl, i + "_") return code diff --git a/db.sqlite3 b/db.sqlite3 index 78e7c41f198982a1b0e799b12d736d6358a3aa8f..33e5d8cef48cd42e121833e95d29653969ab9ead 100644 GIT binary patch delta 367 zcmX|*JxD@P6vxl|IQQQ7^!exmEFyd&LKuc5=2n7(5SBwhG!-E(Z?QeXh!h<9py7d{ zP(w~lnRg1Ltg&)%X$+#Jp_Ya|sN2%;`<>-~&iNPG;X*sSKVqZ-pe5K9WDdsSn1+eW z##VMGE1hTMn$N%$P@oP_*T3=V&~NSWT3f$VnaF1$X8RpGgtLzArG465Ij*~5biwc3 zRn*B78&N3(Z5&yMgJ?cN($f%IP&Gfzck{)3c7`JIrs`>U8oZm6Ey7zuJhf!4ML6hZUp%?gt(k&~K362AEgnG|YbF60vknEZ4`(FIZn+ISJ8vp$B;)o4=1i)L)9sa6pKL$BhQ*Lsl%XSrlZQbyT9$*uHaoU2 zGCVOYEoVAoE|c8!6IWOS*;5ls6mk;_wm-bWvW;mw=M9#4MhRA+6|Q{Cfh5Ch{@?uH z_&@T$;eXEmXu602Q{DE9X-o=i+qao9X>l4f3jx(E;s+8Tyg(ux~@EX9NQf(avrr~XI5iiR^zGw2ACu>D|??mAJ29zVXkAW o(+zBxRJYINV@+mc?q=oRuEEUO$~rB8g{_@UfonUP0{1U_0O>t#0{{R3 diff --git a/static/logo改_3.png b/static/logo改_3.png new file mode 100644 index 0000000000000000000000000000000000000000..707bac3b8f1f8caf5bebd78087065549e86d3ed2 GIT binary patch literal 20512 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

- +

diff --git a/templates/page/index.html b/templates/page/index.html index f524e69..faec845 100644 --- a/templates/page/index.html +++ b/templates/page/index.html @@ -13,7 +13,7 @@
- + diff --git a/templates/page/tools.html b/templates/page/tools.html index 80d2c73..9f74bb1 100644 --- a/templates/page/tools.html +++ b/templates/page/tools.html @@ -41,27 +41,26 @@
  • Basics
    -
    blast
    -
    genbank to fasta
    -
    gff to gtf
    -
    orf
    -
    序列基础
    +
    blast
    +
    gbk to fa
    +
    gff to gtf
    +
    orf
    +
    seq basics
  • Gene Family
    -
    pfam
    +
    pfam
  • Omics
    -
    Differential expression - analysis
    +
    deg
    -
    fastqc
    +
    fastqc
  • diff --git a/templates/tools/Differential_expression_analysis.html b/templates/tools/Differential_expression_analysis.html index 53cf7ec..8aa9d02 100644 --- a/templates/tools/Differential_expression_analysis.html +++ b/templates/tools/Differential_expression_analysis.html @@ -16,7 +16,7 @@