산점도(scatter plot)
2차원 그래프의 기본 구성은 한 축(x)에 대한 값들에 대응하는 다른 축(y)의 값들입니다. 산점도는 대응하는 위치마다 표시를 하는 것으로 다음 함수를 적용합니다.
- plt.scatter(x, y, s, c, marker, label)
- x, y: data
- s: 표시(marker)의 크기, x, y, c외에 다른 변수를 지정하여 그 변수에 따라 크기를 조절할 수 있음
- c: 표시 색, x, y, s외에 다른 변수를 지정하여 그 변수에 따라 색을 조절할 수 있음
- 다양한 marker
- label: 범례
import numpy as np import pandas as pd from sklearn.preprocessing import StandardScaler import yfinance as yf import matplotlib as mpl import matplotlib.pyplot as plt plt.rcParams['font.family'] ='NanumGothic' plt.rcParams['axes.unicode_minus'] =False import seaborn as sns %matplotlib inline
matplotlib하에서 작성된 플롯이지만 seaborn에서 제공하는 플롯의 스타일을 사용할 수 있습니다. 위 코드 sns.set_style() 함수에 의해 이루어집니다.
np.random.seed(1) data=np.random.randn(100, 2) plt.figure(figsize=(4,3)) plt.scatter(data[:,0], data[:,1], s=10, c="b", label="random") plt.xlabel("x", loc="right") plt.ylabel("y", loc="top", rotation="horizontal") plt.legend(loc="best", frameon=False) plt.show()
위 코드에서 xlabel, ylabel은 각각 x, y 축의 이름을 지정하는 것으로 각각의 위치를 지정할 수 있습니다.
- plt.xlabel(이름, loc="left/center/right", color)
- plt.ylabel(이름, loc="bottom/center/upper", rotation, color): 이름은 축과 평행하게 표시가 기본 즉, y축 이름을 수직으로 표시 되므로 수평으로 전환을 위한 회전은 인수 rotation=horizontal 적용
- plt.legend(loc="best", frameon=False): loc=(x, y)와 같이 각 축의 값을 위치로 지정할 수 있음, frameon=False은 범례의 테두리 제거 (plot() 참조)
산점도는 plt.plot() 함수의 마크 스타일을 조정하여 작성할 수 있습니다(plot() 참조).
plt.figure(figsize=(4,3)) plt.plot(data[:,0], data[:,1], "ro") plt.xlabel("x", loc="right") plt.ylabel("y", loc="top", rotation="horizontal") plt.show()
다음은 kospi 일일자료입니다. 이 자료에서 일중 변화율과 Volume의 일간변화율을 목록화하여 조정한 것입니다.
st=pd.Timestamp(2023, 10, 17) et=pd.Timestamp(2024, 10, 17) kos=yf.download("^KS11",st, et) kos=kos.drop('Adj Close', axis=1) kos.index=pd.to_datetime(kos.index.date) kos.columns=kos.columns.levels[0][1:] scaler=StandardScaler().fit(kos) kos1=scaler.transform(kos) kos1df=pd.DataFrame(kos1) kos1df.columns=kos.columns kos1df.index=kos.index kos1df['coChg']=pd.qcut((kos1df.Close-kos1df.Open)/kos1df.Open*100, 10, range(10)) kos1df['volChg']=pd.qcut(kos1df.Volume.pct_change(), 5, range(5)) kos1df=kos1df.dropna() kos1df.head(3)
Price | Close | High | Low | Open | Volume | coChg | volChg |
---|---|---|---|---|---|---|---|
2023-10-18 | -1.325313 | -1.449859 | -1.297633 | -1.442811 | 3.272987 | 3 | 4 |
2023-10-19 | -1.703523 | -1.712166 | -1.603687 | -1.606734 | 2.085993 | 6 | 2 |
2023-10-20 | -2.033245 | -2.031246 | -1.992279 | -1.935555 | 0.271720 | 6 | 1 |
위 자료에서 Close를 volChg로 구분하기 위해 산점도를 작성해 봅니다. x축과 y축은 각각 이 객체의 index와 Close를 전달하는 과정에서 모든 index를 나타내는 대신 일부만을 표시하기 위해 다음 객체 date를 생성합니다.
kos1df.index
DatetimeIndex(['2023-10-18', '2023-10-19', '2023-10-20', '2023-10-23', '2023-10-24', '2023-10-25', '2023-10-26', '2023-10-27', '2023-10-30', '2023-10-31', ... '2024-09-30', '2024-10-02', '2024-10-04', '2024-10-07', '2024-10-08', '2024-10-10', '2024-10-11', '2024-10-14', '2024-10-15', '2024-10-16'], dtype='datetime64[ns]', length=243, freq=None)
panda의 date 객체중에서 pd.date_range() 함수는 주어진 구간에서 일정한 부분을 분취하기 하기 위해 적용합니다.
date=pd.date_range(start=kos1df.index[0], end=kos1df.index[-1], periods=7).date date
array([datetime.date(2023, 10, 18), datetime.date(2023, 12, 17), datetime.date(2024, 2, 16), datetime.date(2024, 4, 17), datetime.date(2024, 6, 16), datetime.date(2024, 8, 16), datetime.date(2024, 10, 16)], dtype=object)
3번째 변수인 volChg을 함수의 인수 c에 전달하였으므로 이 변수의 각 클래스에 대해 다른 색을 지정합니다. 그 색들의 의미를 나타내기 위해 그래프 외부에 colorbar를 나타냅니다. 이를 위해 plt.colorbar()
함수를 실행합니다.
%matplotlib inline plt.figure(figsize=(7,3)) plt.scatter(kos1df.index, kos1df.Close, c=kos1df.volChg) plt.colorbar() plt.xticks(date, rotation=45) plt.xlabel("Time(2014년)") plt.ylabel("Price") plt.axis("tight") plt.title("kospi 종가") plt.show()
댓글
댓글 쓰기