https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.plot.html
data_result["소계"].plot(kind="barh", grid=True, figsize=(10, 10));
def drawGraph():
data_result["소계"].sort_values().plot(
kind="barh", grid=True, figsize=(10, 10));
drawGraph()
세미콜론을 붙이지 않으면 <Axes: xlabel='구별'> 표시가 그래프 상단에 나타난다.
def drawGraph():
plt.figure(figsize=(14, 10))
plt.scatter(data_result["인구수"], data_result["소계"], s=50) # s=사이즈
plt.xlabel("인구수")
plt.ylabel("CCTV")
plt.grid(True)
plt.show()
drawGraph()
https://numpy.org/doc/stable/reference/generated/numpy.polyfit.html
https://numpy.org/doc/stable/reference/generated/numpy.poly1d.html
직선을 구성하는 계수를 계산해주는 기능
인구수를 x축으로 CCTV 개수를 y축으로 하는 1차식을 표현하기 위한 계수
# np.polyfit(x좌표, y좌표, 차수)
fp1 = np.polyfit(data_result["인구수"], data_result["소계"], 1)
fp1
>>>
array([1.11155868e-03, 1.06515745e+03])
polyfit으로 찾은 계수로 함수를 만들어준다.
f1 = np.poly1d(fp1)
f1
>>>
poly1d([1.11155868e-03, 1.06515745e+03])
print(f1)
>>>
0.001112 x + 1065
인구가 40만인 구에서 서울시의 전체 경향에 맞는 적당한 CCTV 수는?
# 0.001112 x + 1065 식의 x 값에 400000를 대입한 결과를 반환
f1(400000)
>>>
1509.7809252413333
경향선을 그리기 위한 x 데이터 생성
# np.linspace(a, b, n) : a부터 b까지 n개의 등간격 데이터 생성
fx = np.linspace(100000, 700000, 100)
plt.plot 추가
def drawGraph():
...
plt.plot(fx, f1(fx), ls="dashed", lw=3, color="g") # lw=굵기
...
drawGraph()
오차 = 실제 값 - 예측 값
data_result["오차"] = data_result["소계"] - f1(data_result["인구수"])
경향 대비 CCTV를 많이 가진 구
df_sort_f = data_result.sort_values(by="오차", ascending=False) # 내림차순
경향 대비 CCTV를 적게 가진 구
df_sort_t = data_result.sort_values(by="오차", ascending=True) # 오름차순
from matplotlib.colors import ListedColormap
color_step = ["#a83232", "#a86532", ... ]
my_cmap = ListedColormap(color_step)
plt.text(x좌표, y좌표, 이름)
plt.text(
df_sort_f["인구수"][0] * 1.02,
df_sort_f["소계"][0] * 0.98,
df_sort_f.index[0],
fontsize=15)
상위 5개, 하위 5개씩 표시하기 위해 for 반복문 사용
# 상위 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
)
공식 문서를 확인하는 게 가장 좋다.
https://matplotlib.org/stable/gallery/index.html
그래프의 결과가 중요한 경우 그래프 그리는 코드를 함수로 작성한다.
그러면 나중에 별도의 셀에 그림만 나타낼 수 있다.
import matplotlib.pyplot as plt
# get_ipython().run_line_magic("Matplotlib", "inline")
%matplotlib inline
from matplotlib import rc
rc("font", family='Malgun Gothic')
# figure로 열어서 show로 닫는다
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])
plt.show()
...\lib\site-packages\IPython\core\pylabtools.py:152: UserWarning: Glyph 8722 (\N{MINUS SIGN}) missing from current font.
➡ 현재 글꼴에 마이너스 기호가 없어서 발생
➡ 하이픈 마이너스 기호를 사용하지 않겠다고 설정
plt.rcParams['axes.unicode_minus'] = False
import numpy as np
# np.arange(a, b, s): a부터 b까지의 s 간격
t = np.arange(0, 12, 0.01)
y = np.sin(t) # sin(0), sin(0.01), ...
def drawGraph():
plt.figure(figsize=(10, 6))
plt.plot(t, np.sin(t), label="sin")
plt.plot(t, np.cos(t), label="cos")
plt.grid(True) # 그리드 표시
plt.legend(loc="upper right") # 범례 표시
#plt.legend(label=["sin", "cos"]) # 범례 표시2
plt.xlabel("time")
plt.ylabel("amplitude")
plt.title("Example of sinwave")
plt.show()
drawGraph()
t = np.arange(0, 5, 0.5)
def drawGraph():
plt.figure(figsize=(10, 6))
plt.plot(t, t, "r--")
plt.plot(t, t ** 2, "bs")
plt.plot(t, t ** 3, "g^")
plt.show()
drawGraph()
t = [0, 1, 2, 3, 4, 5, 6]
y = [1, 4, 5, 8, 9, 5, 3]
def drawGraph():
plt.figure(figsize=(10, 6))
plt.plot(t, y, color="green", linestyle="dashed",
marker="o", markerfacecolor="blue", markersize=12)
plt.xlim([-0.5, 6.5]) # X축의 범위 지정
plt.ylim([0.5, 9.5]) # Y축의 범위 지정
plt.show()
drawGraph()
t = np.array(range(0, 10))
y = np.array([9, 8, 7, 9, 8, 3, 2, 4, 3, 4])
def drawGraph():
plt.figure(figsize=(10, 6))
plt.scatter(t, y)
plt.show()
drawGraph()
t = np.array(range(0, 10))
y = np.array([9, 8, 7, 9, 8, 3, 2, 4, 3, 4])
colormap = t
def drawGraph():
plt.figure(figsize=(10, 6))
plt.scatter(t, y, s=50, c=colormap, marker=">")
plt.colorbar()
plt.show()
drawGraph()