#1. ํ์ผ ์ฐพ์๋ณด๊ธฐ ๋ฒํผ - fl_btn
#2. ํ์ผ ๊ฒฝ๋ก ๋ํ๋๋ ๋ฒํผ - fl_lbl
#3. ๋ถ์ ๊ธฐ๋ฅ ์ง์ ๋๋กญ๋ค์ด ๋ฒํผ - fun_cb
# ์ฌ์ฉ์๋ณ ๋ํ ๋น๋
# ์ฌ์ฉ์๋ณ ์ด๋ชจํฐ์ฝ ์ฌ์ฉ ๋น๋
# ์ฌ์ฉ์๋ณ ํ๋ ์๊ฐ๋
# ์ฌ์ฉ์๋ณ ํ๊ท ๋ต๋ณ ์๊ฐ
#4. ์๊ฐ๋๋ณ ํ๋ ๋น๋ ๋ถ์ ์ฐธ์ฌ์ ์ ํ ํ ์คํธ ์ ๋ ฅ ๋ฐ์ค - filter_te
#5. ๋ถ์ ๊ฒฐ๊ณผ ์ด๋ฏธ์ง ๋ค์ด๋ก๋ ๋ฒํผ - down_btn
#6. ๋ถ์(Start) Run ๋ฒํผ - st_btn
#7. ์ด๊ธฐํ(Reset) Run ๋ฒํผ - rst_btn
#8. ๊ฒฐ๊ณผ ํ๋ฉด - ptr_lbl
์ด์ ๋ง์ง๋ง์ผ๋ก ๋จ์ ๋ฒํผ์ 4๋ฒ๊ณผ 5๋ฒ์ด๋ค.
์๋ฌด๋๋ ํ ์คํธ๋ฅผ ์ ๋ ฅํ๊ณ ์ด๋ฏธ์ง๋ฅผ ๋ค์ด๋ก๋ ํ๋ ๋ฒํผ์ด ๊ฐ์ฅ ์ด๋ ต๋ค๊ณ ๋๊ปด์ก๊ธฐ ๋๋ฌธ์ ๋ง์ง๋ง์ผ๋ก ์์ ์ ํ๋ ๊ฒ ๊ฐ๋ค. (ํ์ง๋ง ๊ฐ์ฅ ์ด๋ ค์ด ์์ ์ ์๋์๋ ๊ฒ ๊ฐ๋ค.)
#4. ์๊ฐ๋๋ณ ํ๋ ๋น๋ ๋ถ์ ์ฐธ์ฌ์ ์ ํ ํ ์คํธ ์ ๋ ฅ ๋ฐ์ค - filter_te
ํ ์คํธ ๋ฐ์ค์ ์ด๋ฆ์ ์ ๋ ฅํ์ฌ ์ฐธ์ฌ์๋ณ๋ก ์๊ฐ๋๋ณ ํ๋ ๋น๋ ์๊ฐ์ ๋ํ ํ์ด์ฐจํธ๋ฅผ ์ถ๋ ฅํ๋ ๊ฒ์ ํ๋์ ๊ธฐ๋ฅ์๋ง ํด๋น๋๋ ๊ฒ์ด๋ค.
๊ทธ๋์ ๋ค์ํ ๋ฐฉ๋ฒ์ ๊ณ ๋ฏผํ๋ค๊ฐ ๊ทธ๋ฅ ๋ค๋ฅธ ๊ธฐ๋ฅ๋ค์ ์ ํํ๊ณ ๋ถ์ ๋ฒํผ์ ๋๋ฅผ ๋ ์ฐธ์ฌ์ ํํฐ๋ง์ ์ ๋ ฅ๊ฐ์ด ์๋ ์๋ ์๊ด์์ด ์๋ ๊ฐ์ด ์ถ๋ ฅ๋๋๋ก ํ๋ค.
ํ์ง๋ง '์๊ฐ๋๋ณ ํ๋ ๋น๋' ๊ธฐ๋ฅ์ ์ ํํ๊ณ ์ด๋ฆ๊ฐ์ ์ ํํ๊ฒ ์ ๋ ฅํ๋ฉด ์ ๋๋ก๋ ํํฐ๋ง์ด ๋๋๋ก ์ฝ๋๋ฅผ ์ง๋ ๊ฒ์ผ๋ก ๊ณํํ๋ค.
๋์ ์ด๋ฆ์ด ํ๋ฆฌ๊ฑฐ๋ ๋น์นธ์ผ๋ก [๋ถ์] ๋ฒํผ์ ํด๋ฆญํ๋ฉด ์ ์ฒด ํ์ด๊ฐ์ด ์ถ๋ ฅ๋๋๋ก ์ค์ ํ๋ค.
๊ธฐ์กด์ ํจ์๋ฅผ ์ ์ํ pyํ์ผ์์๋ ์ ์ฒด ์ถ๋ ฅ๊ณผ ๊ฐ๋ณ ์ถ๋ ฅ ๊ฐ์ด ๋ชจ๋ ๋์ค๋๋ก ์ค์ ๋์ด์๊ธฐ ๋๋ฌธ์ ํด๋น ํจ์๋ฅผ ๊ทธ๋๋ก ํ์ฉํ๋ฉด ๋๋ค.
์ฐ์ ๊ธฐ์กด์ ์์ฑํ๋ "์ฌ์ฉ์๋ณ ๊ฐ ์๊ฐ๋ ํ๋ ๋น๋ ๋ถ์"์ ํจ์์์ name ํํฐ๋ง ๋ค์์ ํ์ด ์ฐจํธ๋ฅผ ์ถ๋ ฅํ๋ ๊ฐ์ด ์กฐ๊ธ ๋ณ๊ฒฝ๋์๋ค.
# ํ์ด ์ฐจํธ ์์ฑ
if not pivot_table.empty:
fig, ax = plt.subplots()
pivot_table.iloc[0].plot(kind='pie', ax=ax, autopct='%1.1f%%', startangle=90, legend=False)
ax.set_title(f"{names[0]}์ ์๊ฐ๋๋ณ ํ๋ ๋น๋")
ax.set_ylabel('')
plt.tight_layout()
else:
pivot_table = activity_by_time.pivot(index='Name', columns='Time_Parts', values='Count_Messages').fillna(0)
fig, axes = plt.subplots(nrows=1, ncols=len(pivot_table), figsize=(15, 5))
for i, (names, data) in enumerate(pivot_table.iterrows()):
data.plot(kind='pie', ax=axes[i], autopct='%1.1f%%', startangle=90, legend=False)
axes[i].set_title(names)
axes[i].set_ylabel('')
plt.tight_layout()
์๋๋ if not ๊ฐ๊ณผ else ๊ฐ์ ์์๊ฐ ๋ฌ๋๋ค.
pivot_table ๊ฐ์ ์๋์ ๊ฐ์๋ฐ
pivot_table = user_data.pivot(index='Name', columns='Time_Parts', values='Count_Messages').fillna(0)
์์ ์ ๋ ฅ๋ names ๊ฐ์ด ์ธ๋ฑ์ค๋ก ๋ค์ด๊ฐ์ ๊ฐ์ ์ถ๋ ฅํ๋ ๊ฒ์ pivot_table์ ๋ฃ์ ๊ฒ์ด๋ค.
๋ง์ฝ pivot_table ๊ฐ์ด ๋น์ด์์ง ์๋ค๋ฉด Name ๊ฐ์ด ์ ๋ ฅ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๊ฐ๋ณ๋ก ์ถ๋ ฅ๋๋ ์ฝ๋๋ฅผ ์์ฑํ์ง๋ง ๋น์ด์๊ฑฐ๋ ์ ๋๋ก ์ ๋ ฅ๋์ง ์์๋ค๋ฉด ๋ค์ pivot_table์ ์ ์ํ์ฌ ๋ฐ๋ณต๋ฌธ์ ์ํด ๋ชจ๋ ๊ฐ์ด ์ถ๋ ฅ๋๋๋ก ์์ฑํ์๋ค.
์ด ํจ์๋ฅผ ํ์ฉํ๋ ์ฝ๋๋ ๋ฐ๋ก qt ํ์ผ์์ ์ถ๊ฐํ ๊ฑด ์๊ณ ์ฝ๋ ๋ช ์ค๋ง ์ถ๊ฐํ๋ฉด ๋๋ค.
์ฐ์ ์๋ก ์คํํ ๋๋ง๋ค ๊ฐ์ฒด๊ฐ ์ด๊ธฐํ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ __init__ ํจ์์ ์๋์ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ค.
self.filter_te = self.findChild(QTextEdit, 'filter_te')
๊ทธ๋ฆฌ๊ณ ๋ถ์์ ์คํํ๋ ๋ฒํผ์ธ [st_btn]์ ์ํด ์์ฑํ ํจ์ start_analyze_data์ filter_te์ ์์ฑ๋ ํ ์คํธ๋ฅผ ๊ฐ์ ธ์์ ์ ๋ ฅํ๋ ์ฝ๋๋ฅผ ์์ฑํด์ค๋ค.
names = self.filter_te.toPlainText()
names = names.split()
ํด๋น ์ฝ๋๋ฅผ ์ถ๊ฐํด์ฃผ๋ฉด start_analyze_data ํจ์์์ ์์ฑ๋๋ ์ฝ๋ ๊ฐ์ ์๋์ ๊ฐ๋ค.
if self.selected_value == '์ฌ์ฉ์๋ณ ๋ํ ๋น๋':
self.fig = count_messages_by_name(self.refined_data)
self.plot_pixmap()
elif self.selected_value == '์ฌ์ฉ์๋ณ ์ด๋ชจํฐ์ฝ ์ฌ์ฉ ๋น๋':
self.fig = count_emoticon_usage(self.refined_data, '์ด๋ชจํฐ์ฝ')
self.plot_pixmap()
elif self.selected_value == '์ฌ์ฉ์๋ณ ํ๊ท ๋ต๋ณ ์๊ฐ':
self.fig = calculate_response_time(self.refined_data)
self.plot_pixmap()
elif self.selected_value == '์ฌ์ฉ์๋ณ ํ๋ ์๊ฐ๋':
self.fig = analyze_activity_by_time(self.refined_data, names)
self.plot_pixmap()
names ๊ฐ์ ์ ์ํด์คฌ๊ธฐ ๋๋ฌธ์ '์ฌ์ฉ์๋ณ ํ๋ ์๊ฐ๋' ํจ์์์ names ๋ฅผ ํ์ฉํ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ๊ธฐ๋ฅ ๊ฐ์์๋ ์ ์ ์๋์ด์๊ธฐ ๋๋ฌธ์ names ๊ฐ์ ์ํฅ์ ๋ฐ์ง ์๋๋ค.
๋ง์ง๋ง์ผ๋ก ๊ฒฐ๊ณผ ํ๋ฉด์ ๋ฆฌ์ ํ ๋ filter_te์ ์์ฑ๋ ๊ฐ๋ ํจ๊ป ๋ฆฌ์ ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ reset_canvas ํจ์์
self.filter_te.clear()
ํด๋น ์ฝ๋๋ฅผ ์ถ๊ฐํด์ค๋ค.
์ด๋ ๊ฒํ๋ฉด ํํฐ๋ง ๊ธฐ๋ฅ์ ๋ํ ํจ์ ์ฐ๊ฒฐ์ ์์ฑ๋๋ค.
#5. ๋ถ์ ๊ฒฐ๊ณผ ์ด๋ฏธ์ง ๋ค์ด๋ก๋ ๋ฒํผ - down_btn
์ถ๋ ฅ ๊ฒฐ๊ณผ ๊ฐ์ GUI์์ ํ์ธํ๊ณ ์ด๋ฏธ์ง๋ก๋ ๋ค์ด๋ฐ์ ์ ์๋ ํจ์๋ฅผ ์์ฑํ๋ค.ํจ์๋ช ์ download_image ์ธ๋ฐ ์ฌ์ค ํด๋น ๋ถ๋ถ์ ์์ฑ์ ์์ ๋ชฐ๋ผ์ gpt๊ฐ ์์ฑํด์ค๋๋ก ์ ์ฉํ๋๋ ๋์๋ค.
def download_image(self):
file_path, _ = QFileDialog.getSaveFileName(self, "์ด๋ฏธ์ง ์ ์ฅ", "", "PNG Files (*.png);;All Files (*)")
if file_path:
self.fig.savefig(file_path, format='png')
- QFileDialog.getSaveFileName์ ์ฌ์ฉ์๊ฐ ํ์ผ์ ์ ์ฅํ ์์น์ ์ด๋ฆ์ ์ ํํ ์ ์๋๋ก ํ์ผ ์ ์ฅ ๋ํ ์์๋ฅผ ํ์ํ๋ค.
- "์ด๋ฏธ์ง ์ ์ฅ" : ํ์ผ ๋ํ ์์ ์ ๋ชฉ์ผ๋ก ์ฌ์ฉ๋๋ค.
- " PNG Files (*.png);;All Files (*)" : ํ์ผ ํ์ ํํฐ๋ฅผ ์ง์ ํ๋ค. ์ฌ๊ธฐ์๋ PNG ํ์ผ๋ง ์ ํํ ์ ์๋๋ก ํ๊ณ , ๋ชจ๋ ํ์ผ ํ์๋ ์ ํํ ์ ์๊ฒ ํ๋ค.
- if file_path๋ฅผ ์์ฑํ์ฌ ์ฌ์ฉ์๊ฐ ํ์ผ ๊ฒฝ๋ก๋ฅผ ์ ํํ๋ค๋ฉด ์กฐ๊ฑด๋ฌธ์ด ์คํ๋๋๋ก ์ค์ ํ๋ค.
- file_path๋ก ์ง์ ๋ ๊ฒฝ๋ก์ ์ด๋ฏธ์ง๋ฅผ PNG ํ์์ผ๋ก ์ ์ฅํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ผ๋ก ํด๋น ํจ์๋ฅผ qt์ ๊ฐ์ฒด์ธ down_btn ์์ ฏ์ ์ฐ๊ฒฐํด์ค๋ค.
(__init__ ์์)
self.down_btn.clicked.connect(self.download_image)
์ด๋ ๊ฒํ๋ฉด ๋ชจ๋ ํจ์ ์ ๋ ฅ์ ๋๋๋ค.
์ ๋ ฅํ ํจ์์ ๋ฉ์ธ ์ ์ธ ํจ์๋ฅผ ํจ๊ป ์คํํ๋ฉด ๋์ํ๋ GUI๋ฅผ ํ์ธํ ์ ์๋ค.
๋ง์ง๋ง ๊ฒ์๊ธ์ ๋์ํ๋ ๊ฒฐ๊ณผ๋ฌผ ์์์ ์ฒจ๋ถํ ์์ ์ด๋ค.
'๐ก Data Analysis > ๐ Project - Analysis of KakaoTalk (end)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[QT][Python] (์ต์ข ๋ณธ.gif) ์นด์นด์คํก ๋ํ๋ด์ฉ ๋ถ์๊ธฐ (0) | 2024.08.12 |
---|---|
[QT][Python] ํจ์์ QT ์ฐ๊ฒฐํ๊ธฐ (3) (1) | 2024.08.01 |
[QT][Python] ํจ์์ QT ์ฐ๊ฒฐํ๊ธฐ (2) (0) | 2024.08.01 |
[QT][Python] ํจ์์ QT ์ฐ๊ฒฐํ๊ธฐ (1) (0) | 2024.07.31 |
[QT] QT Designer ๋ก ๋์์ธํ๊ธฐ (0) | 2024.07.31 |