Matplotlib์ ํ์ด์ฌ ๋ฐ์ดํฐ ์๊ฐํ์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค.
๋ฐ์ดํฐ๋ฅผ ์ , ๋ง๋, ์ํ ๋ฑ ๋ค์ํ ํํ๋ก ์๊ฐํํ ์ ์์ผ๋ฉฐ, Pandas์ plot() ๋ฉ์๋์๋ ์์ฐ์ค๋ฝ๊ฒ ์ฐ๊ฒฐ๋๋ค.
import pandas as pd
import matplotlib.pyplot as plt
๊ฐ์ฅ ๋จ์ํ๋ฉด์๋ ๊ฐ๋ ฅํ ์๊ฐํ ํํ.
๋ฐ์ดํฐ์ ์ถ์ธ(trend)๋ฅผ ์ง๊ด์ ์ผ๋ก ๋ณด์ฌ์ค๋ค.
x = [1, 2, 3, 4, 5]
y = [10, 20, 25, 30, 35]
plt.plot(x, y, color='royalblue', marker='o', linestyle='--')
plt.title('๊ธฐ๋ณธ ์ ๊ทธ๋ํ ์์')
plt.xlabel('X์ถ')
plt.ylabel('Y์ถ')
plt.grid(True)
plt.show()
ํต์ฌ ํฌ์ธํธ
color: ์ ์์ ์ง์ ('r', 'b', 'g', ํน์ 'hex ์ฝ๋')marker: ์ ํํ ์ง์ ('o', '^', 's')linestyle: ์ ์คํ์ผ ('-', '--', ':')plt.grid(True): ๋ฐฐ๊ฒฝ ๊ฒฉ์ ํ์Pandas DataFrame์์๋ ์ง์ .plot()์ ํธ์ถํ ์ ์๋ค.
df = pd.DataFrame({
'์': [1, 2, 3, 4, 5],
'๋งค์ถ์ก': [250, 310, 400, 390, 520]
})
df.plot(x='์', y='๋งค์ถ์ก', kind='line', color='green', marker='s', title='์๋ณ ๋งค์ถ ์ถ์ธ')
plt.show()
Pandas์ .plot()์ ๋ด๋ถ์ ์ผ๋ก Matplotlib์ ํธ์ถํ๋ค.
pandas_datareader๋ก ์ผํ ๊ธ์ต ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ฌ ์ ์๋ค.
!pip install pandas_datareader
from pandas_datareader import data as pdr
import datetime
start = datetime.datetime(2020, 1, 1)
end = datetime.datetime(2024, 12, 31)
apple = pdr.get_data_yahoo('AAPL', start, end)
apple.head()
plt.figure(figsize=(12, 6))
plt.plot(apple.index, apple['Close'], label='AAPL', color='navy')
plt.title('Apple ์ฃผ๊ฐ ์ถ์ธ (2020โ2024)')
plt.xlabel('๋ ์ง')
plt.ylabel('์ฃผ๊ฐ ($)')
plt.legend()
plt.show()
Tip:
rolling()์ ์ด์ฉํ ์ด๋ํ๊ท ์ (MA) ํ์๊ฐ ํจ๊ณผ์ ์ด๋ค.apple['MA30'] = apple['Close'].rolling(30).mean()
apple[['Close', 'MA30']].plot(figsize=(12,6), title='Apple ์ฃผ๊ฐ & 30์ผ ์ด๋ํ๊ท ')
ํ๋์ Figure์ ์ฌ๋ฌ ๋ฐ์ดํฐ ์๋ฆฌ์ฆ๋ฅผ ํํํ๋ค.
plt.figure(figsize=(10, 6))
plt.plot(apple['Close'], label='Close', color='blue')
plt.plot(apple['Open'], label='Open', color='orange')
plt.title('Open vs Close')
plt.legend()
plt.show()
์ฌ๋ฌ ๊ฐ์ ๊ทธ๋ํ๋ฅผ ํยท์ด๋ก ๋ฐฐ์น.
fig, axes = plt.subplots(2, 1, figsize=(10, 8))
axes[0].plot(apple['Close'], color='green')
axes[0].set_title('Close Price')
axes[1].plot(apple['Volume'], color='gray')
axes[1].set_title('Trading Volume')
plt.tight_layout()
plt.show()
ํต์ฌ ํฌ์ธํธ
plt.subplots(nrows, ncols) : ๊ทธ๋ํ ๊ฒฉ์ ์์ฑaxes[row][col] ์ ๊ทผ์ผ๋ก ๊ฐ๋ณ ์ค์ plt.tight_layout() : ๊ฒน์นจ ๋ฐฉ์ง๋ณ์ ๊ฐ ์๊ด๊ด๊ณ ํ์์ ์ฌ์ฉ.
plt.scatter(apple['Open'], apple['Close'], alpha=0.5, color='purple')
plt.title('Open vs Close Scatter Plot')
plt.xlabel('Open Price')
plt.ylabel('Close Price')
plt.show()
alpha๋ก ํฌ๋ช
๋ ์กฐ์ ๊ฐ๋ฅ โ ๋ฐ์ดํฐ๊ฐ ๋ง์์๋ก ์ ์ฉ.
๋น์จ ์๊ฐํ์ ์ ์ฉํ๋ค.
labels = ['Apple', 'Microsoft', 'Google', 'Amazon']
sizes = [35, 30, 25, 10]
plt.pie(sizes, labels=labels, autopct='%1.1f%%', startangle=90, colors=['#007AFF', '#FF9500', '#34C759', '#FF3B30'])
plt.title('Tech ๊ธฐ์
์์ฅ ์ ์ ์จ')
plt.show()
์ฃผ์ ์ต์
autopct: ํผ์ผํธ ํ์ ํฌ๋งทstartangle: ํ์ ์์ ๊ฐ๋๋ฐ์ดํฐ ๋ถํฌ๋ฅผ ์๊ฐํ.
import numpy as np
data = np.random.randn(1000)
plt.hist(data, bins=30, color='skyblue', edgecolor='black')
plt.title('๋ฐ์ดํฐ ๋ถํฌ ํ์คํ ๊ทธ๋จ')
plt.xlabel('๊ฐ')
plt.ylabel('๋น๋์')
plt.show()
ํ์ฉ ์์:
Matplotlib ๊ธฐ๋ฐ์ ๊ณ ๊ธ ํต๊ณ ์๊ฐํ ํจํค์ง๋ก, ์คํ์ผยทํ๋ ํธยท๋ ์ด์์์ด ์๋ ์ ์ฉ๋๋ค.
import seaborn as sns
sns.set_theme(style='whitegrid')
tips = sns.load_dataset('tips')
sns.scatterplot(data=tips, x='total_bill', y='tip', hue='sex', size='size', palette='coolwarm')
plt.title('์์ฌ ๊ธ์ก vs ํ (์ฑ๋ณ/์ธ์๋ณ)')
plt.show()
hue: ์์ ๊ตฌ๋ถ ๋ณ์size: ๋ง์ปค ํฌ๊ธฐ ๋ณ์palette: ์์ ํ๋ ํธ ('viridis', 'coolwarm', 'Set2' ๋ฑ)์นด์ดํธ ํ๋กฏ
sns.countplot(data=tips, x='day', hue='sex')
plt.title('์์ผ๋ณ ๋ฐฉ๋ฌธ์ ์ (์ฑ๋ณ ๊ตฌ๋ถ)')
plt.show()
์ฌ๋ฌ ๋ณ์์ ์๊ด๊ด๊ณ๋ฅผ ํ ๋ฒ์ ์๊ฐํ.
sns.pairplot(tips, hue='sex', palette='husl')
plt.suptitle('Pairplot: ๋ณ์ ๊ฐ ๊ด๊ณ ์๊ฐํ', y=1.02)
plt.show()
โ ๊ฐ ๋ณ์ ์กฐํฉ๋ณ ์ฐ์ ๋ + ํ์คํ ๊ทธ๋จ ์๋ ์์ฑ.
corr = tips.corr(numeric_only=True)
sns.heatmap(corr, annot=True, cmap='YlGnBu', linewidths=0.5)
plt.title('๋ณ์ ๊ฐ ์๊ด๊ด๊ณ ํํธ๋งต')
plt.show()
ํ์ฉ
| ํญ๋ชฉ | Matplotlib ์ฝ๋ | Seaborn ์ฝ๋ |
|---|---|---|
| ์ ์ญ ์คํ์ผ ๋ณ๊ฒฝ | plt.style.use('seaborn-v0_8') | sns.set_theme(style='whitegrid') |
| ํ๋ ํธ ์ค์ | plt.rcParams['axes.prop_cycle'] | sns.set_palette('Set2') |
| ํฌ๊ธฐ ๋ณ๊ฒฝ | plt.figure(figsize=(10,6)) | sns.set(rc={'figure.figsize':(10,6)}) |
| ํ๊ธ ํฐํธ ์ค์ | plt.rc('font', family='NanumGothic') | ๋์ผ ์ ์ฉ ๊ฐ๋ฅ |
fig, axes = plt.subplots(1, 2, figsize=(12, 5))
sns.histplot(tips['total_bill'], kde=True, ax=axes[0])
sns.boxplot(data=tips, x='day', y='tip', palette='pastel', ax=axes[1])
plt.tight_layout()
plt.show()
โก ๋์ผ Figure ๋ด์์ ์ฌ๋ฌ ์๊ฐํ ํ์ ํผํฉ ๊ฐ๋ฅ.
| ๊ตฌ๋ถ | ์ฃผ์ ๊ธฐ๋ฅ | ํต์ฌ ๋ฌธ๋ฒ |
|---|---|---|
| Matplotlib | ๋ฒ์ฉ ๊ทธ๋ํ ์ ์ | plt.plot, plt.scatter, plt.hist |
| Subplots | ์ฌ๋ฌ ๊ทธ๋ํ ๋ฐฐ์น | plt.subplots(nrows, ncols) |
| Pandas + Matplotlib | .plot() ํตํฉ | df.plot(kind='line') |
| Seaborn | ๊ณ ๊ธ ์๊ฐํ | sns.scatterplot, sns.heatmap, sns.pairplot |
| ์คํ์ผ๋ง | ์์, ํฐํธ, ํฌ๊ธฐ ์กฐ์ | plt.style.use, sns.set_theme |
rolling() ์ด๋ํ๊ท + Matplotlib line plotcountplot + boxplot ์กฐํฉsns.pairplot, sns.heatmap์ผ๋ก ๋ณ์ ๊ฐ ์ฐ๊ด์ฑ ํ์ธsales, volume, profit ์ธ ๊ฐ ์ฐจํธ๋ฅผ ํ ํ๋ฉด์ ์ ๋ฆฌ