오늘도 Seaborn으로 만든 많은 그래프 이미지를 정리하면서 블로그를 쓰는 순간이 걱정됐다. 일단 이미지 세팅을 따로 저장해 두고 계속 복사하면서 작성해봐야겠다.
import seaborn as sns
import matplotlib.pyplot as plt
sns.__version__
sns.get_dataset_names()
df = sns.load_dataset("car_crashes")
df.head()
import matplotlib.font_manager as fm
for f in fm.fontManager.ttflist:
print(f.name)
테마 스타일 설정
sns.set_style() : 스타일 테마 설정
sns.set_context() : 문맥에 따라 스타일 크기 조정
sns.set_palette() : 색상 팔레트 설정
sns.set_style("white")
sns.set_context("notebook")
sns.set_palette("muted")
# 이후 폰트 깨짐 방지 설정
# 한글 깨짐 방지
# Windows에서 한글 폰트 설정
plt.rcParams['font.family'] = 'Malgun Gothic' # '맑은 고딕'이 설치되어 있을 경우
plt.rcParams['axes.unicode_minus'] = False # 마이너스(-) 부호 깨짐 방지
# macOS에서 한글 폰트 설정
plt.rcParams['font.family'] = 'AppleGothic' # macOS 기본 한글 폰트
plt.rcParams['axes.unicode_minus'] = False
countplot()palette = sns.color_palette("deep")
tips = sns.load_dataset("tips")
sns.countplot(data=tips, x="day", hue="sex", edgecolor="black", palette=palette)
plt.title("요일별 방문자수", size=15, pad=20)
plt.grid(linestyle=":", alpha=0.7)
plt.ylabel("count", rotation=0, labelpad=25)
plt.show()
barplot()palette = sns.color_palette("pastel6")
sns.barplot(data=tips, x="day", y="tip", palette=palette, saturation=1, width=0.5, linewidth=1)
plt.title("요일별 평균 팁 금액")
plt.grid(linestyle=":", alpha=0.7)
plt.ylabel("tip", rotation=0, labelpad=20)
plt.show()
boxplot()sns.set_theme(style="whitegrid")
plt.figure(figsize=(8, 6))
sns.boxplot(data=tips, x="day", y="total_bill", hue="sex", palette="Set2")
plt.title("Boxplot of Total Bill by Day and Sex", fontsize=14)
plt.xlabel("Day of the Week")
plt.ylabel("Total Bill ($)")
plt.legend(title="Sex")
plt.tight_layout()
plt.show()
violinplot()boxplot + 커널 밀도(kde)plt.subplot(1, 3, 1)
sns.violinplot(data=tips, x="day", y="total_bill")
plt.figure(figsize=(15, 5))
plt.title("Violinplot")
plt.show()
stripplot()데이터가 많으면 점이 겹쳐서 밀집된 부분이 뭉쳐 보임
작은 데이터셋에서 개별 값 확인에 유용
plt.subplot(1, 3, 2)
sns.stripplot(data=tips, x="day", y="total_bill", jitter=True)
plt.figure(figsize=(15, 5))
plt.title("Stripplot")
plt.show()
swarmplot()stripplot 과 비슷하지만, 점이 겹치지 않게 자동으로 퍼짐sns.swarmplot(data=tips, x="day", y="total_bill", hue="sex", palette="Set2", size=6)
plt.title("Swarmplot of Total Bill by Day and Sex", fontsize=14)
plt.xlabel("Day of the Week")
plt.ylabel("Total Bill ($)")
plt.legend(title="Sex")
plt.tight_layout()
plt.show()
displot()sns.displot(data=tips, x="total_bill", edgecolor="black", alpha=0.5, kde=True, bins=20)
plt.title("Total bill")
plt.grid(linestyle=":", alpha=0.7)
plt.ylabel("count", rotation=0, labelpad=25)
plt.xlabel("total_bill", labelpad=10)
plt.show()
histplot()plt.figure(figsize=(18, 5))
plt.subplot(1, 3, 1)
sns.histplot(data=tips, x="total_bill", bins=20,hue="sex", multiple="stack", palette="Set2")
plt.title("Histplot")
plt.show()
kdeplot()plt.figure(figsize=(18, 5))
plt.subplot(1, 3, 2)
sns.kdeplot(data=tips, x="total_bill", hue="sex", fill=True, palette="Set2")
plt.title("KDEplot")
plt.show()
rugplot()kdeplot이나 histplot과 함께 사용하면 효과적plt.figure(figsize=(18, 5))
plt.subplot(1, 3, 3)
sns.kdeplot(data=tips, x="total_bill", fill=True, color="skyblue", alpha=0.4)
sns.rugplot(data=tips, x="total_bill", hue="sex", palette="Set2")
plt.title("Rugplot + KDEplot")
plt.show()
scatterplot()palette = sns.color_palette("pastel6")
sns.scatterplot(data=tips, x="total_bill", y="tip", hue="sex", palette=palette)
plt.grid(linestyle=":", alpha=0.7)
plt.ylabel("tip", rotation=0, labelpad=20)
plt.show()
lineplot()plt.figure(figsize=(8,5))
sns.lineplot(data=tips, x="size", y="total_bill", hue="sex", style="sex", markers=True, dashes=False, palette="Set2")
plt.title("Lineplot Example")
plt.show()
relplot()kind="line" : 선 그래프kind="scatter" : 산점도plt.figure(figsize=(8,5))
sns.relplot(data=tips, x="size", y="total_bill", hue="sex", col="day", kind="line", markers=True, dashes=False, palette="Set2", height=4, aspect=1)
plt.show()
pairplot()sns.pairplot(data=penguins, hue="species", palette="Set2")
plt.show()
heatmap()corr = penguins.corr(numeric_only=True)corr = penguins.corr(numeric_only=True)
sns.heatmap(corr, annot=True, fmt=".2f", cmap="coolwarm", square=False)
plt.xticks(rotation=45)
plt.show()
jointplot()sns.jointplot(data=penguins, x="flipper_length_mm", y="body_mass_g", kind="hex", cmap="viridis")
plt.show()
jointplot(kind="reg")palette = sns.color_palette("pastel6")
sns.jointplot(data=penguins, x="flipper_length_mm", y="body_mass_g", kind="reg", palette=palette)
plt.ylabel("body_mass_g", rotation=0, labelpad=40)
plt.grid(linestyle=":", alpha=0.7)
plt.show()
from bs4 import BeautifulSoup
import requests
soup = BeautifulSoup(html_data, "lxml")
print(soup.prettify())
“lxml” : HTML과 XML 파일을 위한 Parser“html.parser” : HTML용 내장 Parserfind()result = soup.find("h1")
print(result)
# <h1 class="" title="">Hello BeautifulSoup</h1>
print(result.text)
# Hello BeautifulSoup
print(result.get_text())
# Hello BeautifulSoup
result = soup.find("h1", class_="sub_title")
print(result.text)
# 안녕 아름다운 수프
find_all()result = soup.find_all("h1")
print(result)
# [<h1 class="title">Hello BeautifulSoup</h1>, <h1 class="sub_title">안녕 아름다운 수프</h1>]
for i in result:
print(i.text)
# Hello BeautifulSoup
# 안녕 아름다운 수프
select()result = soup.select("ul.items")
print(result)
# [<ul class="items">
# <li data-id="1">사과</li>
# <li data-id="2">바나나</li>
# <li data-id="3">체리</li>
# </ul>, <ul class="items">
# <li data-id="1">python</li>
# <li data-id="2">c++</li>
# <li data-id="3">SQL</li>
# </ul>]
for i in result:
print(i.text)
# 사과
# 바나나
# 체리
# python
# c++
# SQL
select_one()result = soup.select_one("ul.items")
print(result)
# <ul class="items">
# <li data-id="1">사과</li>
# <li data-id="2">바나나</li>
# <li data-id="3">체리</li>
# </ul>
headers = {
"User-Agent": "Mozilla/5.0"
}
response = requests.get(url, headers=headers)
.get().status_code.content오늘은 이미지 작업이 꽤나 수월했다. 이미지를 정렬하고 사이즈를 조절하면 이상하게 줄바꿈을 했을때 2칸 들여쓰기가 돼서 글을 쓰거나 파트별로 줄바꿈을 할 때 불편했는데 줄바꿈과 틀을 다 잡아두고 이미지를 정리하니까 그런 불편함이 많이 줄었다.