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)