😎 자기소개

시각화 겹치기

1. 각각의 데이터들을 따로 시각화

markercluster_nooverlap.py
5.5KB
gui_map_nooverlap.html
493.0KB
투명도 없이 진하게 표시됨

2. 기온,강수량,대기오염도,유동인구 겹쳐서 시각화

markercluster_overlap.py
5.1KB
gui_map_overlap.html
385.8KB
투명도 있게 표시됨
GUI.py
12.3KB
# ============================================================================= # ============================================================================= # # 멀캠 최종 프로젝트 GUI # ============================================================================= # ============================================================================= # < GUI 만들기 > import tkinter as tk from tkinter import ttk # 인스턴스 만들기 win = tk.Tk() # 타이틀 정하기 win.title("멀티캠퍼스 최종 프로젝트") # 창 사이즈 win.geometry("640x480") # 사이즈 조절 가능 여부 설정 (세로, 가로) win.resizable(True, True) # (세로 고정, 가로 조절 가능) # ============================================================================= # tab 만들기 # ============================================================================= tabControl = ttk.Notebook(win) # Create Tab Control tab1 = ttk.Frame(tabControl) # Create a tab tabControl.add(tab1, text='주말 야외 데이트 지역 추천') tabControl.pack(expand=1, fill="both") # Pack to make visible # ============================================================================= # 첫 번째 탭 만들기 # ============================================================================= # < label frame 만들기 > # tab 1에 라벨 프레임 (weight) 만들기 weight = ttk.LabelFrame(tab1, text='가중치를 정하세요', labelanchor = 'n') weight.pack(side = 'top', pady=10) # tab 1에 라벨 프레임 (month) 만들기 month = ttk.LabelFrame(tab1, text='원하는 월을 선택하세요', labelanchor = 'n') month.pack(side = 'top', pady=10) # tab 1에 라벨 프레임 (srch) 만들기 srch = ttk.LabelFrame(tab1, text='버튼을 클릭하세요', labelanchor = 'n') srch.pack(side = 'top', pady=10) # 라벨 추가 (라벨 프레임 안에) ## weight 안에 추가 label = ttk.Label(weight, text = "기온") label.grid(row = 0 , column = 0) label2 = ttk.Label(weight, text = "강수량") label2.grid(row = 1 , column = 0) label3 = ttk.Label(weight, text = "대기오염도") label3.grid(row = 2 , column = 0) label4 = ttk.Label(weight, text = "유동인구") label4.grid(row = 3 , column = 0) ## month 안에 추가 label5 = ttk.Label(month, text = "월 선택") label5.grid(row = 0, column = 0) # 라디오 버튼 (가중치) ## 기온 가중치 RadioVariety=tk.IntVar() radio1=tk.Radiobutton(weight, text="상", value=3, variable=RadioVariety) radio1.grid(row = 0 , column = 1) radio2=tk.Radiobutton(weight, text="중", value=2, variable=RadioVariety) radio2.grid(row = 0 , column = 2) radio3=tk.Radiobutton(weight, text="하", value=1, variable=RadioVariety) radio3.grid(row = 0 , column = 3) ## 강수량 가중치 RadioVariety2=tk.IntVar() radio5=tk.Radiobutton(weight, text="상", value=3, variable=RadioVariety2) radio5.grid(row = 1 , column = 1) radio6=tk.Radiobutton(weight, text="중", value=2, variable=RadioVariety2) radio6.grid(row = 1 , column = 2) radio7=tk.Radiobutton(weight, text="하", value=1, variable=RadioVariety2) radio7.grid(row = 1 , column = 3) ## 대기오염도 가중치 RadioVariety3=tk.IntVar() radio9=tk.Radiobutton(weight, text="상", value=3, variable=RadioVariety3) radio9.grid(row = 2 , column = 1) radio10=tk.Radiobutton(weight, text="중", value=2, variable=RadioVariety3) radio10.grid(row = 2 , column = 2) radio11=tk.Radiobutton(weight, text="하", value=1, variable=RadioVariety3) radio11.grid(row = 2 , column = 3) ## 유동인구 가중치 RadioVariety4=tk.IntVar() radio13=tk.Radiobutton(weight, text="상", value=3, variable=RadioVariety4) radio13.grid(row = 3 , column = 1) radio14=tk.Radiobutton(weight, text="중", value=2, variable=RadioVariety4) radio14.grid(row = 3 , column = 2) radio15=tk.Radiobutton(weight, text="하", value=1, variable=RadioVariety4) radio15.grid(row = 3 , column = 3) # 콤보박스 values=[str(i)+"월" for i in range(1, 13)] combobox=tk.ttk.Combobox(month, height=15, values=values) combobox.grid(row = 0, column = 1) combobox.set("목록 선택") # 버튼 함수 정의 def datecourse() : # 1. 파일 불러오기 import pandas as pd # 기온 temp_norm = pd.read_csv("C:/Users/USER/Desktop/python/mulcam_final_project/정규화/temp_norm.csv",encoding='euc-kr') temp_norm.index temp_norm = temp_norm.set_index("district") # 강수량 rain_norm = pd.read_csv("C:/Users/USER/Desktop/python/mulcam_final_project/정규화/rain_norm.csv",encoding='euc-kr') rain_norm.index rain_norm = rain_norm.set_index("district") # 대기오염도 dust_norm = pd.read_csv("C:/Users/USER/Desktop/python/mulcam_final_project/정규화/dust_norm.csv",encoding='euc-kr') dust_norm.index dust_norm = dust_norm.set_index("district") # 유동인구 flt_pp_norm = pd.read_csv("C:/Users/USER/Desktop/python/mulcam_final_project/정규화/flt_pp_norm.csv",encoding='euc-kr') flt_pp_norm.index flt_pp_norm = flt_pp_norm.set_index("district") # 공원 위치 park_loc = pd.read_csv('C:/Users/USER/Desktop/python/mulcam_final_project/전처리/공원/서울시 주요 공원현황_3.csv',encoding='euc-kr') # 맛집 위치 rest_loc = pd.read_csv('C:/Users/USER/Desktop/python/mulcam_final_project/전처리/맛집/restaurant.csv',encoding='euc-kr') # 2. 서울시 구별 경계선 데이터 불러오기 import json geo_path = 'C:/Users/USER/Desktop/python/P_4week/02.skorea_municipalities_geo_simple.json' geo_str = json.load(open(geo_path, encoding='utf-8')) # 3. 가중치 부여 temp_norm = temp_norm*int(RadioVariety.get()) rain_norm = rain_norm*int(RadioVariety2.get()) dust_norm = dust_norm*int(RadioVariety3.get()) flt_pp_norm = flt_pp_norm*int(RadioVariety4.get()) # 4. 지도에 시각화 하기 import folium total_map = folium.Map(location=[37.5502, 126.982], zoom_start=11, tiles='Stamen Terrain') # 기온 total_map.choropleth(geo_data = geo_str, data = temp_norm[combobox.get()], columns = [temp_norm.index, temp_norm[combobox.get()]], fill_color = 'PuRd', #PuRd, YlGnBu key_on = 'feature.id', name = "기온") # 강수량 total_map.choropleth(geo_data = geo_str, data = rain_norm[combobox.get()], columns = [rain_norm.index, rain_norm[combobox.get()]], fill_color = 'PuRd', #PuRd, YlGnBu key_on = 'feature.id', name = "강수량") # 대기오염도 total_map.choropleth(geo_data = geo_str, data = dust_norm[combobox.get()], columns = [dust_norm.index, dust_norm[combobox.get()]], fill_color = 'PuRd', #PuRd, YlGnBu key_on = 'feature.id', name = "대기오염도") # 유동인구 total_map.choropleth(geo_data = geo_str, data = flt_pp_norm[combobox.get()], columns = [flt_pp_norm.index, flt_pp_norm[combobox.get()]], fill_color = 'PuRd', #PuRd, YlGnBu key_on = 'feature.id', name = "유동인구") # 공원 MarkerCluster from folium.plugins import MarkerCluster p_lat = park_loc.lat.values p_lng = park_loc.lng.values p_locations = list(zip(p_lat,p_lng)) p_popups = list(park_loc.name.values) p_icons = [folium.Icon(icon="tree", prefix="fa", color="green") for _ in range(len(p_locations))] p_icon_create_function = """\ function(cluster) { return L.divIcon({ html: '<b>' + cluster.getChildCount() + '</b>', className: 'marker-cluster marker-cluster-small', iconSize: new L.Point(30, 30) }); }""" p_marker_cluster = MarkerCluster( locations=p_locations, popup=p_popups, name='공원', overlay=True, control=True, icon_create_function = p_icon_create_function, icons = p_icons) p_marker_cluster.add_to(total_map) # 맛집 MarkerCluster r_lat = rest_loc.lat.values r_lng = rest_loc.lng.values r_locations = list(zip(r_lat,r_lng)) r_popups = list(rest_loc.restaurant.values) r_icons = [folium.Icon(icon="heart", prefix="fa", color="orange") for _ in range(len(r_locations))] r_icon_create_function = """\ function(cluster) { return L.divIcon({ html: '<b>' + cluster.getChildCount() + '</b>', className: 'marker-cluster marker-cluster-large', iconSize: new L.Point(30, 30) }); }""" r_marker_cluster = MarkerCluster( locations=r_locations, popups=r_popups, name='맛집', overlay=True, control=True, icon_create_function = r_icon_create_function, icons = r_icons) r_marker_cluster.add_to(total_map) folium.LayerControl().add_to(total_map) save_path = "C:/Users/USER/Desktop/python/mulcam_final_project/시각화/GUI/datearea_" + str(combobox.get()) + ".html" total_map.save(save_path) # webbrowser 로 지도 띄우기 from selenium import webdriver import time url = 'file:///' + save_path driver = webdriver.Chrome('D:/Temp/chromedriver_win32/chromedriver.exe') # 빈 브라우저 띄움 time.sleep(1) driver.get(url) # 버튼 추가 srchbutton = ttk.Button(srch,text="조건에 맞는 지역 찾기", width=20, command= datecourse) srchbutton.grid(row=0, column = 0) # ============================================================================= # 메뉴 만들기 # ============================================================================= # Creating a Menu Bar from tkinter import Menu from tkinter import messagebox as msg menu_bar = Menu(win) # 취상위 메뉴 = menu_bar win.config(menu=menu_bar) # 최상위 메뉴 만들기 # Add menu items file_menu = Menu(menu_bar, tearoff=0) # 최상위 메뉴 아래에 file_menu 만들기 menu_bar.add_cascade(label="File", menu=file_menu) # file_menu를 "File" 이라는 이름으로 메뉴 만들기 # .add_cascade -> 메뉴를 수직으로 정렬 # Exit 함수 만들기 def _quit(): win.quit() win.destroy() exit() file_menu.add_separator() # 메뉴 구분 file_menu.add_command(label="Exit", command=_quit) # file 메뉴에 "Exit" 탭 추가 + 명령함수 (_quit) # Display a Message Box def _msgBox(): msg.showinfo('Information', '멀티캠퍼스 최종 프로젝트 (author : 김수연,이혁수,김경주)\n\t\t만든년도 : 2020.') # Add another Menu to the Menu Bar and an item help_menu = Menu(menu_bar, tearoff=0) # 최상위 메뉴 아래에 help_menu 만들기 menu_bar.add_cascade(label="Help", menu=help_menu) # help_menu를 "Help"라는 이름으로 메뉴 만들기 help_menu.add_command(label="About", command=_msgBox) # display messagebox when clicked # ============================================================================= # 실행 아이콘 만들기 # ============================================================================= # Change the main windows icon 아이콘 변경 win.iconbitmap('C:/Users/USER/Desktop/python/mulcam_final_project/시각화/park.ico') # ico 파일 # ============================================================================= # 실행 # ============================================================================= win.mainloop()
Python
복사