Spaces:
Runtime error
Runtime error
| import matplotlib.pyplot as plt | |
| import streamlit as st | |
| import seaborn as sns | |
| from interact_with_llm import Agent | |
| import json | |
| import numpy as np | |
| agent = Agent() | |
| QUESTION_ANSWER_MAP = { | |
| "Question1: Are you usually?": { | |
| "A 'Good Mixer with groups of people": "Extrovert", | |
| "Rather quiet and reserved": "Introvert" | |
| }, | |
| "Question2: Among your friends, you are?": { | |
| "Full of news about everybody": "Extrovert", | |
| "One of the last to hear what is going on": "Introvert" | |
| }, | |
| "Question3: In doing something that many other people do, you would rather?": { | |
| "Invent a way of your own": "Intuition", | |
| "Do it in the accepted way": "Sensing" | |
| }, | |
| "Question4: Do you admire the people who are?": { | |
| "Normal-acting to never make themselves the center of attention": "Sensing", | |
| "Too original and individual to care whether they are the center of attention or not": "Intuition" | |
| }, | |
| "Question5: Do you more often let?": { | |
| "Your heart rule your head": "Feeling", | |
| "Your head rule your heart": "Thinking" | |
| }, | |
| "Question6: Do you usually?": { | |
| "Value emotion more than logic": "Feeling", | |
| "Value logic more than feelings": "Thinking" | |
| }, | |
| "Question7: When you go somewhere for the day, you would rather": { | |
| "Plan what you will do and when": "Judging", | |
| "Just go": "Perceiving" | |
| }, | |
| "Question8: When you have a special job to do, you like to": { | |
| "Organize it carefully before you start": "Judging", | |
| "Find out what is necessary as you go along": "Perceiving" | |
| } | |
| } | |
| final = {"E_I": 0, "S_N":0, "T_F":0, "J_P":0 } | |
| personality_map = {"Extrovert":("E_I", 0), "Introvert":("E_I", 50), | |
| "Sensing":("S_N", 0), "Intuition":("S_N", 50), | |
| "Thinking":("T_F", 0), "Feeling":("T_F", 50), | |
| "Judging":("J_P", 0), "Perceiving":("J_P", 50)} | |
| def process_choice(dic): | |
| final = {"J_P":0 ,"T_F":0, "S_N":0, "E_I": 0 } | |
| for k, v in dic.items(): | |
| pair = personality_map[QUESTION_ANSWER_MAP[k][v]] | |
| final[pair[0]] += pair[1] | |
| return final | |
| def process_other(other): | |
| agent = Agent() | |
| result = {} | |
| for k,v in other.items(): | |
| pair = agent.send_msg({k:v}) | |
| result[pair[0]] = pair[1] | |
| final = {"J_P":0 ,"T_F":0, "S_N":0, "E_I": 0 } | |
| for k,v in result.items(): | |
| pair = personality_map[k] | |
| try: | |
| final[pair[0]] += 0.5 * int(v) | |
| except: | |
| final[pair[0]] += 25 | |
| return final | |
| def analyze_post(post): | |
| agent = Agent() | |
| result = agent.send_post(post) | |
| print(result) | |
| try: | |
| data = json.loads(result) | |
| final = {"J_P":0 ,"T_F":0, "S_N":0, "E_I": 0 } | |
| final['E_I'] = 100 - data["Extrovert-Introvert"]["score"] | |
| final['S_N'] = 100 - data["Sensing-Intuition"]["score"] | |
| final["T_F"] = 100 - data["Thinking-Feeling"]["score"] | |
| final["J_P"] = 100 - data["Judging-Perceiving"]["score"] | |
| except: | |
| final = {} | |
| return final | |
| def generate_image(final): | |
| if final == {}: | |
| st.write("I have no idea about it. Please provide more information") | |
| return | |
| # 初始化画布和坐标轴 | |
| fig, ax = plt.subplots(figsize=(6, 6)) | |
| # 设置渐变颜色 | |
| colors = [ | |
| ['#FF6347', '#FFD700'], | |
| ['#00FA9A', '#32CD32'], | |
| ['#6495ED', '#4682B4'], | |
| ['#DDA0DD', '#8A2BE2'] | |
| ] | |
| # 创建一个大的图像数组 | |
| img = np.zeros((100, 100, 3), dtype=np.uint8) | |
| sorted_keys = ["E_I", "S_N", "T_F", "J_P"] | |
| personality= "" | |
| for k in sorted_keys: | |
| v = final[k] | |
| if v < 50: | |
| personality += k[0] | |
| else: | |
| personality += k[2] | |
| for idx, k in enumerate(sorted_keys): | |
| v = final[k] | |
| if idx == 0: # 左上 | |
| img[int(50*(1-v/100)):50, :50] = np.array([int(colors[idx][0][i:i+2], 16) for i in (1, 3, 5)]) | |
| img[:int(50*(1-v/100)), :50] = np.array([int(colors[idx][1][i:i+2], 16) for i in (1, 3, 5)]) | |
| elif idx == 1: # 右上 | |
| img[int(50*(1-v/100)):50, 50:] = np.array([int(colors[idx][0][i:i+2], 16) for i in (1, 3, 5)]) | |
| img[:int(50*(1-v/100)), 50:] = np.array([int(colors[idx][1][i:i+2], 16) for i in (1, 3, 5)]) | |
| elif idx == 2: # 左下 | |
| img[50+int(50*(1-v/100)):, :50] = np.array([int(colors[idx][0][i:i+2], 16) for i in (1, 3, 5)]) | |
| img[50:int(50*(1-v/100))+50, :50] = np.array([int(colors[idx][1][i:i+2], 16) for i in (1, 3, 5)]) | |
| else: # 右下 | |
| img[50+int(50*(1-v/100)):, 50:] = np.array([int(colors[idx][0][i:i+2], 16) for i in (1, 3, 5)]) | |
| img[50:int(50*(1-v/100))+50, 50:] = np.array([int(colors[idx][1][i:i+2], 16) for i in (1, 3, 5)]) | |
| ax.set_title(f'Your MBTI persopnality may be {personality}', fontsize=16) | |
| ax.imshow(img) | |
| ax.axis('off') # 不显示坐标轴 | |
| # 在每个部分中添加文本 | |
| for idx, k in enumerate(sorted_keys): | |
| v = final[k] | |
| if idx == 0: | |
| ax.text(25, 25, f"{k[0]} {100-v:.0f}%\n{k[2]} {v:.0f}%", ha='center', va='center', color='black', fontsize=12) | |
| elif idx == 1: | |
| ax.text(75, 25, f"{k[0]} {100-v:.0f}%\n{k[2]} {v:.0f}%", ha='center', va='center', color='black', fontsize=12) | |
| elif idx == 2: | |
| ax.text(25, 75, f"{k[0]} {100-v:.0f}%\n{k[2]} {v:.0f}%", ha='center', va='center', color='black', fontsize=12) | |
| else: | |
| ax.text(75, 75, f"{k[0]} {100-v:.0f}%\n{k[2]} {v:.0f}%", ha='center', va='center', color='black', fontsize=12) | |
| # 使用st.pyplot显示图表 | |
| st.pyplot(fig) | |
| # def generate_image(final): | |
| # # 初始化列表来保存标签和值 | |
| # labels = [] | |
| # values_l = [] | |
| # values_r = [] | |
| # sorted_keys = ["J_P","T_F","S_N", "E_I"] | |
| # # 遍历字典,更新标签和值列表 | |
| # for k in sorted_keys: | |
| # v = final[k] | |
| # labels.append(k) | |
| # values_l.append(100-v) | |
| # values_r.append(v) | |
| # personality = '' | |
| # for k in sorted_keys: | |
| # v = final[k] | |
| # if v < 50: | |
| # personality += k[0] | |
| # else: | |
| # personality += k[2] | |
| # personality = personality[::-1] | |
| # fig, ax = plt.subplots(figsize=(10,6)) | |
| # # 使用Seaborn的更漂亮的默认样式 | |
| # sns.set(style="whitegrid") | |
| # # 为每个键绘制两个条形图,一个为E/S/T/J值,另一个为I/N/F/P值 | |
| # width = 0.4 | |
| # ind = range(len(labels)) | |
| # p1 = ax.barh(ind, values_l, width, color=sns.color_palette("coolwarm", 4)[2], label='E/S/T/J') | |
| # p2 = ax.barh(ind, values_r, width, left=values_l, color=sns.color_palette("coolwarm", 4)[0], label='I/N/F/P') | |
| # # 设置标签和标题 | |
| # ax.set_yticks(ind) | |
| # ax.set_yticklabels([label[0] for label in labels]) | |
| # ax.set_xticks([0, 50, 100]) | |
| # ax.set_xlabel('Percentage', fontsize=14) | |
| # ax.set_title(f'Your MBTI persopnality may be {personality}', fontsize=16) | |
| # ax.legend(loc = 'upper right', bbox_to_anchor=(1.15, 1.15)) | |
| # # 显示右侧的'I/N/F/P'标签 | |
| # for i, label in enumerate(labels): | |
| # ax.text(105, i, label[2], ha='center', va='center', color='black', fontsize=12) | |
| # # 使用st.pyplot显示图表 | |
| # st.pyplot(fig) | |