728x90
반응형
1. 지도 그리기
2. 지도 표시하기
# -*- coding: utf-8 -*-
"""
Created on Mon Jun 27 10:03:22 2022
@author: p011v
"""
'''
pandas 데이터
unique() : 중복없이 한개의 데이터만 조회
value_counts() : 데이터별 등록된 건수. 건수의 내림차순으로 정렬 출력
groupby(컬럼명) : 컬럼의 값으로 레코트를 그룹화. 그룹별 통계자료 조회 가능
pivot_table() : 2개의 컬럼을 행열형태의 표로 데이터 생성
seaborn 모듈을 이용한 그래프
regplot : 산점도 + 회귀선
distplot : 밀도선 + 갯수의 막대그래프 표시. 밀도, 갯수 선택 가능
kdeplot : 밀도선
histplot : 갯수의 막대그래프
heatmap : 표로 이루어진 데이터를 색상으로 표시
'''
import seaborn as sns
import matplotlib.pyplot as plt
titanic = sns.load_dataset("titanic")
#하나의 영역에 4개의 그래프를 만듬
fig = plt.figure(figsize=(15, 10))
ax1 = fig.add_subplot(2, 2, 1) #2행2열 1번째
ax2 = fig.add_subplot(2, 2, 2) #2행2열 2번째
ax3 = fig.add_subplot(2, 2, 3) #2행2열 3번째
ax4 = fig.add_subplot(2, 2, 4) #2행2열 4번째
#boxplot : box그래프 출력. 값의 범주를 그래프로 출력
#hue='sex' : 성별을 기준으로 분리.
sns.boxplot(x='alive', y='age', data=titanic, ax=ax1)
sns.boxplot(x='alive', y='age', hue='sex', data=titanic, ax=ax2)
#violinplot : 값의 범주 + 분포도를 표시
sns.violinplot(x='alive', y='age', data=titanic, ax=ax3)
sns.violinplot(x='alive', y='age', hue='sex', data=titanic, ax=ax4)
ax2.legend(loc="upper center")
ax4.legend(loc="upper center")
plt.show()
# FacetGrid : 조건(컬럼의 값)에 따라 그리드 나누기
titanic.who.value_counts()
g = sns.FacetGrid(data=titanic, col='who', row='survived')
g = g.map(plt.hist, 'age') #age컬럼의 히스토그램을 출력
# pairplot : 각각의 컬럼별 데이터 분포 그리기
# 각변수(컬럼)들의 산점도 출력
# 대각선위치의 그래프는 히스토그램으로 표시
titanic_pair = titanic[['age', 'pclass', 'fare']]
print(titanic_pair)
sns.pairplot(titanic_pair)
########## 1. 지도 그리기
##### folium 모듈 사용하기
import folium #pip install folium
#location=[37.55,126.98]: 지도 중심의 위도 경도 값 설정.
#zoom_start=13: 지도 확대값
seoul_map = folium.Map(location=[37.55,126.98],zoom_start=8)
seoul_map.save("seoul.html")
seoul_map2 = folium.Map(location=[37.55,126.98],zoom_start=12,tiles="stamentoner")
seoul_map2.save("seoul2.html")
gwangju_map = folium.Map(location=[37.402739953406, 127.25519515055],zoom_start=30)
gwangju_map.save("gwangju.html")
'''
tiles : 지도 표시되는 형식 설정.
openstreetmap : 기본값
cartodbdark_matter
cartodbpositron
cartodbpositrononlylabels
stamentonerbackground
stamentonerlabels
stamenterrain, Stamen Terrain
stamenwatercolor (물 표시)
stamentoner, Stamen Toner (도로중심 표시)
'''
#파일에 등록된 위도, 경도를 읽어 지도에 표시하기
import pandas as pd
import folium
df = pd.read_excel('data/서울지역 대학교 위치.xlsx', index_col=0)
df.head()
df.info()
seoul_map = folium.Map(location=[37.55,126.98],zoom_start=12)
# folium.Marker:지도에 표시하기.
# [lat, lng]: 위도 경도. 마크위치를 위도경도로 설정.
# popup=name: 마커를 클릭 시 표시되는 내용.
# tooltip=name: 마커 내부에 마우스 커서가 들어온 경우 표시되는 내용
# add_to(지도객체): 지도에 추가
# df.index : 대학명
# df.위도 : 대학의 위도 정보
# df.경도 : 대학의 경도 정보
for name, lat, lng in zip(df.index, df.위도, df.경도):
#name : 대학명
#lat : 대학의 위도 정보
#lng : 대학의 경도 정보
folium.Marker([lat, lng], popup=name,tooltip=name).add_to(seoul_map)
seoul_map.save('seoul_colleges.html')
#zip(리스트1,리스트2): 리스트1의 요소한개, 리스트2의 요소한개를 튜플로 만들어서
# 하나의 리스트로 합쳐주는 함수.
lista = ['a','b','c']
list1=[1,2,3]
list2=['가','나','다']
# ('a', 1, '가'), ('b', 2, '나'), ('c', 3, '다')
listall = zip(lista,list1,list2)
list(listall)
for b in zip(lista,list1,list2) :
print(b)
for a,n,h in zip(lista,list1,list2) :
print(a,n,h)
#원형 마커 출력하기
seoul_map = folium.Map(location=[37.55, 126.98], zoom_start=12)
for name, lat, lng in zip(df.index, df.위도, df.경도):
folium.CircleMarker([lat, lng], #위도, 경도값
radius=10, #반지름 크기
color='brown', #원 둘레 색상
fill=True, #원 내부를 채움
fill_color="coral", #원 내부 색상
fill_opacity=0.7, #원 내부의 투명도 0 ~ 1 : 0(투명), 1(불투명)
popup=name #클릭시 나타나는 내용
).add_to(seoul_map)
seoul_map.save('seoul_colleges2.html')
#아이콘 설정하기
# icon['home', 'flag', 'bookmark', 'star']
df = pd.read_excel('data/서울지역 대학교 위치.xlsx', index_col=0)
seoul_map = folium.Map(location=[37.55, 126.98],zoom_start=12)
for name, lat, lng in zip(df.index, df.위도, df.경도):
folium.Marker([lat, lng], popup=name,tooltip=name,
# icon=folium.Icon(color='red', icon='home' : 마커의 색상과 icon 선택
icon=folium.Icon(color='red', icon='flag')).add_to(seoul_map)
seoul_map.save('seoul_colleges3.html')
#문제 : Library.csv 파일을 읽어서 도서관 정보를 지도에 표시하기
# 1. Library.csv 파일을 읽어서 library 변수에 저장하기
library = pd.read_csv('data/Library.csv')
library.info()
library.head()
library.시설명.head()
# 2. 시설명, 위도, 경도 컬럼을 이용하여 지도에 마크를 찍어 지도 출력하기
# seoul_library.html 파일로 지도 생성하기
seoul_map = folium.Map(location=[37.55, 126.98],zoom_start=12)
for name, lat, lng in zip(library.시설명, library.위도, library.경도):
folium.Marker([lat, lng], popup=name,tooltip=name,
icon=folium.Icon(color='red', icon='star')).add_to(seoul_map)
seoul_map.save('seoul_library.html')
library.시설구분.unique()
#시설구분별로 색상 설정하기
library = pd.read_csv('data/Library.csv')
seoul_map = folium.Map(location=[37.55, 126.98],zoom_start=12)
for name, lat, lng, kbn in zip(library.시설명, library.위도, library.경도, library.시설구분):
if kbn == '구립도서관' or kbn == '국립도서관' :
color = 'green'
elif kbn == '사립도서관' :
color = 'red'
else :
color = 'blue'
folium.Marker([lat, lng], popup=kbn,tooltip=name,
icon=folium.Icon(color=color,icon='bookmark')).add_to(seoul_map)
seoul_map.save('seoul_library2.html')
#MarkerCluster 기능: 지도 확대 정도에 따라 마커 표시 방법을 달리 표시해줌. 그룹화기능
from folium.plugins import MarkerCluster
from folium import Marker
seoul_map = folium.Map(location=[37.55, 126.98],zoom_start=12)
mc = MarkerCluster()
#library.iterrows: 반복문에서 사용하면, 레코드의 인덱스와 한개의 레코드 값만 조회.
# _: 인덱스값. _이름의 변수명 사용한 이유는 인덱스를 사용하지 않기 때문. (변수명 사용하기 귀찮아서..)
#row: 한 개의 레코드 값.
for _, row in library.iterrows():
mc.add_child( #mc 객체에 추가
#folium.Marker 객체 생성, import 했기 때문에 folium 생략 가능.
Marker(location = [row['위도'], row['경도']],
popup=row['시설구분'],
tooltip=row['시설명']
)
)
seoul_map.add_child(mc)
seoul_map.save("seoul_library3.html")
# 경기도의 인구 데이터와 위치 정보를 이용하여 인구를 지도에 출력하기.
import pandas as pd
import folium
import json #json 형태의 파일을 처리하기 위한 모듈
#1. 경기도 인구 데이터를 읽어 df 변수에 저장하기. 구분컬럼을 인덱스로 처리하기
df=pd.read_excel('data/경기도인구데이터.xlsx', index_col='구분')
df.info()
df.columns
#df 데이터의 컬럼의 자료형을 문자열형의 목록으로 변경하기.
df.columns = df.columns.map(str)
df.columns
#2. 위치 정보를 가지고 있는 경기도행정구역경계.json 파일 읽기
# 경기도행정구역경계.json 파일의 내용을 읽어서 json 형식의 객체(dict 객체)로 load
# json형식 {"키":"값", "키2":"값2", ...}
geo_data=json.load(open('data/경기도행정구역경계.json', encoding='utf-8'))
type(geo_data) #딕셔너리 객체
geo_data
########## 2. 지도 표시하기
g_map = folium.Map(location=[37.55, 126.98],zoom_start=9)
year = '2007'
# 지도에 데이터의 크기만큼 색상으로 표시
# geo_data : 위치 정보를 저장하는 딕셔너리 객체 설정. 경계를 표시해주는 데이터. 위도, 경도 정보
# data : 표시하고자 하는 데이터
# fill_color : 색상표. 파렛트, 데이터에 맞는 색상값을 가져오기 위한 색상표
# Bugn
# fill_opacit : 내부 색상 투명도
# line_opacity : 경계선 투명도
# threshold_scale : 데이터와 색상 표시할 때 사용되는 범위 지정
# key_on='feature.properties.name' : 데이터와 지역경계부분 연결 설정
folium.Choropleth(geo_data=geo_data,
data = df[year], #df['2007']
columns = [df.index, df[year]], #지역명, 데이터
fill_color='YlOrRd', fill_opacity=0.7, line_opacity=0.3,
threshold_scale=[10000, 100000, 300000, 500000, 700000],
key_on='feature.properties.name',
).add_to(g_map)
g_map.save('gyonggi_population_' + year + '.html')
# us-states.json, US_Unemployment_Oct2012.csv 사용하여 지도로 표시하기
import folium
import pandas as pd
state_geo = "data/us-states.json"
state_unemployment = "data/US_Unemployment_Oct2012.csv"
state_data = pd.read_csv(state_unemployment)
m = folium.Map(location=[48, -103],zoom_start=3, tiles="Stamen Toner")
folium.Choropleth(
state_geo, #위도, 경도 데이터를 가진 파일의 이름
data = state_data, #데이터
columns = ["State", "Unemployment"], #컬럼명 설정
key_on = "feature.id", #데이터와 지도표시연결. state_geo 데이터의 id 값
fill_color = 'YlGn',
fill_opacity = 0.7,
line_opacity = 0.2,
legend_name = "Unemployment Rate (%)",
).add_to(m)
m.save('usa1.html')
728x90
반응형
'study > Python' 카테고리의 다른 글
[Python] 38. Test 답 (0) | 2022.06.27 |
---|---|
[Python] 38. Test (0) | 2022.06.27 |
[Python] 37. Test 답 (0) | 2022.06.27 |
[Python] 37. Test (0) | 2022.06.22 |
[Python] 37. matplot 모듈을 이용한 그래프, 연합막대 그래프 그리기, 히스토그램으로 출력하기, 파이그래프, 박스그래프, 그룹화하기, seaborn 모듈을 이용한 시각화 (0) | 2022.06.22 |