1.matplotlib
파이썬의 2D 그래픽스 라이브러리로, 주로 데이터 시각화를 위해 사용된다. 데이터 분석과 과학 계산에서 널리 사용되는 도구로, 간단한 플롯부터 복잡한 다차원 그래프까지 다양한 형태의 그래프를 그릴 수 있다.
2.라인분리
이전 만든 코드에서 줄분리에서 시간부분을 따로 변수에 저장해서 보관해준다.
#줄 분리 함수 (시간,이름,텍스트 부분 분리, 단어형태소분리)
def split_line(line):
talkday,talk_main=line.split(", ", 1)
ampm,talk_time=talkday.split("일 ",1)[1].split(" ",1)
talk_time=int(talk_time.split(":")[0])
if((ampm=="오후" and talk_time!=12) or (ampm=="오전" and talk_time==12)):talk_time+=12
name,txt=talk_main.split(" : ")
return talk_time,name,txt
#통계치에 추가함수
def add_statistics(talk_time,name,kor_list):
#등록되지않은 사용자 추가
if(name not in human):
kor_dics[name]={}
human.append(name)
human_talktime[name]={i:0 for i in range(1,25)}
#시간 추가
human_talktime[name][talk_time]+=1
#단어 추가
for voca in kor_list:
try:
kor_dics[name][voca]+=1
except:
kor_dics[name][voca]=1
# 파일 열기 (읽기 모드로)
with open(file_path, 'r', encoding='utf-8') as file:
# 파일의 각 줄에 대해 반복
cnt=0
for line in file:
cnt+=1
try:
#라인분리,형태소분리,통계추가
talk_time,name,txt=split_line(line)
if(len(txt)>=2000):continue
kor_list=okt.nouns(txt.strip())
add_statistics(talk_time,name,kor_list)
except:
print(str(cnt)+"줄 오류")
continue
#if(cnt==50000):break #줄수 제한할때사용
print(cnt) #몇번째 줄인지 출력
3.그래프 그리기
matplotlib을 이용하여 각 사용자에 대한 카톡시간대의 통계를 담은 막대그래프를 출력한다.
for human_name in human:
data[human_name]={name: value for name, value in human_talktime[human_name].items()}
print(data)
drawgraph(human,data)
def drawgraph(human, data):
num_people = len(human)
num_cols = 2 # 2열로 그래프를 나타내기 위한 설정
num_rows = (num_people + num_cols - 1) // num_cols # 적절한 행 개수 계산
fig, axes = plt.subplots(nrows=num_rows, ncols=num_cols, figsize=(12, 4 * num_rows))
if num_people == 1:
axes = [axes] # 하나의 사람일 경우를 처리
for i, human_name in enumerate(human):
row = i // num_cols
col = i % num_cols
keys = list(data[human_name].keys())
values = list(data[human_name].values())
keys_int = [int(key) for key in keys]
bars = axes[row, col].bar(keys_int, values, color='skyblue')
axes[row, col].set_xticks(keys_int)
axes[row, col].set_ylabel('개수')
axes[row, col].set_title(f'{human_name}')
axes[row, col].tick_params(axis='x', rotation=45) # x 축 눈금 라벨 회전 설정
# 각 막대 위에 개수 표시
for bar in bars:
yval = bar.get_height()
axes[row, col].annotate(f'{yval}', xy=(bar.get_x() + bar.get_width() / 2, yval),
xytext=(0, 3), textcoords='offset points',
ha='center', va='bottom')
axes[row, col].set_ylim(top=max(values) * 1.1)
# 남은 빈 그래프 제거
if num_people % num_cols != 0:
for i in range(num_people % num_cols, num_cols):
fig.delaxes(axes[num_rows-1, i])
# 그래프 간의 간격 조정
plt.tight_layout()
plt.subplots_adjust(wspace=0.2, hspace=0.3)
plt.show()
'Language > Python' 카테고리의 다른 글
[Python] 애니 데이터 크롤링 (0) | 2024.07.28 |
---|---|
[오류][Python] 가상환경을 활성화해도 적용이 안될때 (0) | 2024.07.12 |
[Python]카카오톡 단어 분석 프로그램 (0) | 2024.07.11 |