구별 인구수와 CCTV 설치 대수의 산포도 및 추세선을 그려보고 경향에서 크게 벗어난 데이터를 강조해보자
import matplotlib.pyplot as plt
# import matplotlib as mpl
plt.rcParams["axes.unicode_minus"] = False
#마이너스 부호 때문에 폰트가 깨질 수가 있어 설정하는 코드
rc("font", family =" Malgun Gothic")
# %matplotlib inline
get_ipython().run_line_magic("matplotlib","inline")
# 한글이 깨질 수 있어 설정하는 코드
fpl = np.polyfit(data_result["인구수"],data_result["소계"],1)
# 인구수를 x , 소계(cctv대수)를 y로 할 때 1차식(선형회귀식) 계수 생성
f1= np.poly1d(fpl)
# fpl 계수를 대입한 1차함수 생성
fx=np.linspace(100000, 700000, 100)
# 경향선을 그리기 위한 x데이터 생성
data_result["오차"]= data_result["소계"]-f1(data_result["인구수"])
# data_result 데이터 셋에 "오차" 콜룸 추가
# 추세선에서 많이 떨어져 있는 구 산출용으로 정렬
df_sort_f=data_result.sort_values(by="오차", ascending = False) #내림차순
df_sort_t=data_result.sort_values(by="오차", ascending = True) #오름차순
# colormap을 사용자 정의로 세팅
from matplotlib.colors import ListedColormap
color_step = ["#e74c3c","#2ecc71","#95a9a6","#2ecc71","#3498db","#3498db"]
my_cmap = ListedColormap(color_step)
# 산포도, 추세선, 경향에서 많이 벗어난 구 표기
def drawGraphFinal():
plt.figure(figsize=(14,10))
plt.scatter(
data_result["인구수"],
data_result["소계"],
s=50, # 마커의 사이즈
c=data_result["오차"], # 색이 달라지는 기준 값
cmap=my_cmap)
plt.plot(
fx,
f1(fx),
ls = "dashed",
lw = 3, #선 굵기
color = "g")
# 오차 + 상위 5개 구 이름 표기
for n in range(5):
plt.text(
df_sort_f["인구수"][n]*1.02,
df_sort_f["소계"][n]*0.98,
df_sort_f.index[n], fontsize = 15)
# 오차 - 하위 5개 구 이름 표기
for n in range(5):
plt.text(
df_sort_t["인구수"][n]*1.02,
df_sort_t["소계"][n]*0.98,
df_sort_t.index[n], fontsize = 15)
plt.xlabel("인구수")
plt.ylabel("CCTV")
plt.colorbar()
plt.grid(True)
plt.show()
기타 matplotlib 기초
import matplotlib.pyplot as plt
from matplotlib import rc
from matplotlib import font_manager
f_path = "C:/Windows/Fonts/malgun.ttf"
font_manager.FontProperties(fname = f_path).get_name()
rc("font",family="Malgun Gothic")
# %matplotlib inline
get_ipython().run_line_magic("matplotlib","inline")
# matplotlib는 기본적으로 한국어를 지원하지 않는다
# 한글이 깨지지 않으려면 위와 같이 한글 폰트를 불러와야 한다.
plt.figure(figsize = (10,6))
# 데이터를 그리기 위한 배경 설정
plt.plot([0,1,2,3,4,5,6,7,8,9],[1,1,2,3,4,2,3,5,-1,3])
# 데이터 x축과 y축 값 설정
plt.show()
# 그래프 출력
def drawGraph():
plt.figure(figsize = (10, 6))
plt.plot(t, np.sin(t), label = "sin") #그래프이름 "sin"으로 설정
plt.plot(t, np.cos(t), label = "cos")
plt.grid(True) # 그래프에 격자 넣기
plt.legend(loc="upper right") #범례
plt.title("Example of sinwave") #그래프 제목 넣기
plt.xlabel("time") # x축 이름
plt.ylabel("Amplitude") #y축 이름
plt.show()
plt.figure(figsize = (10, 6))
plt.plot(t,t, "r--") # red ---
plt.plot(t,t**2, "bs") # blue square
plt.plot(t, t**3, "g^") # green triangle
plt.show()
t = list(range(0,7))
y = [1,4,5,8,9,5,3]
def drawGraph2():
plt.figure(figsize=(10, 6))
plt.plot(
t, #x 값
y, #y값
color = "green",
linestyle = "dashed",
marker = "o",
markerfacecolor = "blue",
markersize = 15
)
plt.xlim([-0.5, 6.5]) # x축 범위
plt.ylim([0.5, 9.5]) # y축 범위
plt.grid()
plt.show()
def drawGraph3():
plt.figure(figsize = (10, 6))
plt.scatter(t, y) # 산포도 그리기
plt.show()
def drawGraph4():
plt.figure(figsize = (20, 6))
plt.scatter(t, y, s= 100, c= colormap, marker= ">")
plt.colorbar() # 컬러바 넣기
plt.show()