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) | |