BSA06_Data-Visualization-Libraries.ipynb
패키지 불러오기
import pandas as pd
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
from bokeh.plotting import figure
from bokeh.io import output_notebook, push_notebook, show
from bokeh.layouts import layout
from bokeh.models import Div, RangeSlider, Spinner
from bokeh.plotting import figure, show
import plotly.express as px
from plotnine import ggplot, geom_point, aes, stat_smooth, facet_wrap
from plotnine.data import mtcars
from plotnine import geom_col, geom_path, scale_color_discrete
1. Matplotlib
# 선그래프 그리기
## subplots : 그림을 여러 개 그릴 수 있음
fig, ax = plt.subplots(figsize=(12, 5))
ax.plot([1, 2, 3, 4], [1, 4, 2, 3])
plt.show()
# 색상과 크기가 다른 산점도(scatterplot)
# a : x축 값, b : y축 값, c : 색상, d : 원의 크기
np.random.seed(1906) # seed the random number generator
# "a" : np.arange(50) : 'a'값에 랜덤으로 50개 저장
# "c" : np.random.randint(0, 50, 50) : 'c'값에 0~50 사이의 난수 50개 저장
data = {"a" : np.arange(50), "c" : np.random.randint(0, 50, 50), "d" : np.random.randn(50)}
# np.random.randn(50) : 정규난수를 추가해 표준편차가 10인 값이 추가되도록 함
data["b"] = data["a"] + 10 * np.random.randn(50)
# abs : 절댓값
data["d"] = np.abs(data["d"]) * 100
fig, ax = plt.subplots(figsize=(12, 5), layout="constrained")
# s(size)='d' : d의 값에 의해 사이즈 결정
# c(color)='c' : c의 값으로 색상 결정
ax.scatter("a", "b", c="c", s="d", data=data)
ax.set_xlabel("entry a")
ax.set_ylabel("entry b")
plt.show()
# 크기가 100인 4개 데이터세트
data1, data2, data3, data4 = np.random.randn(4, 100)
# 한 그림에 여러 데이터세트 그리기
fig, ax = plt.subplots(figsize=(12, 5))
ax.plot(data1, "o", label="data1")
ax.plot(data2, "d", label="data2")
ax.plot(data3, "v", label="data3")
ax.plot(data4, "s", label="data4")
# 여러 그림으로 구성된 그림
X, Y = np.meshgrid(np.linspace(-3, 3, 128), np.linspace(-3, 3, 128))
Z = (1 - X / 2 + X ** 5 + Y ** 3)*np.exp(-(X ** 2) - Y ** 2)
fig, axs = plt.subplots(2, 2, figsize=(15, 15), layout="constrained")
pc = axs[0, 0].pcolormesh(X, Y, Z, vmin=-1, vmax=1, cmap="RdBu_r")
fig.colorbar(pc, ax=axs[0, 0])
axs[0, 0].set_title("pcolormesh()")
co = axs[0, 1].contourf(X, Y, Z, levels=np.linspace(-1.25, 1.25, 11))
fig.colorbar(co, ax=axs[0, 1])
axs[0, 1].set_title("contourf()")
pc = axs[1, 0].imshow(
Z ** 2 * 100, cmap="plasma", norm=mpl.colors.LogNorm(vmin=0.01, vmax=100)
)
fig.colorbar(pc, ax=axs[1, 0], extend="both")
axs[1, 0].set_title("imshow() with LogNorm()")
pc = axs[1, 1].scatter(data1, data2, c=data3, cmap="RdBu_r")
fig.colorbar(pc, ax=axs[1, 1], extend="both")
axs[1, 1].set_title("scatter()")
2. Seaborn
# 예제(tips) 데이터 불러오기
tips = sns.load_dataset("tips")
# 비교 산점도 : col=좌우, row=상하
# relplot : 비교산점도
sns.relplot(
data=tips,
# 전체 금액에 비해 팁 금액 비교
x="total_bill",
y="tip",
# col : 좌우로 비교 / row : 아래위로 비교
# time='Dinner'인 데이터와 time='Lunch'인 데이터 비교
col="time",
hue="smoker",
style="smoker",
size="size"
)
plt.show()
# 선형 관계가 보임
# 통계적 추정
fmri = sns.load_dataset("fmri")
sns.relplot(
data=fmri,
kind="line",
x="timepoint",
y="signal",
col="region",
hue="event",
style="event"
)
plt.show()
# 범주형 그림
sns.catplot(
data=tips, kind="swarm", x="day", y="total_bill", hue="smoker", height=5, aspect=2.3
)
plt.show()
# kind="violin", "bar", ...
penguins = sns.load_dataset("penguins")
sns.jointplot(
data=penguins, x="flipper_length_mm", y="bill_length_mm", hue="species", height=10
)
sns.pairplot(data=penguins, hue="species")
3. Bokeh
output_notebook() # output을 panel에 보냄
x = [1, 2, 3, 4, 5]
y = [6, 7, 2, 4, 5]
# 새로운 그림 생성
p = figure(title="Simple line example", x_axis_label="x", y_axis_label="y")
# 선을 추가
p.line(x, y, legend_label="Temp.", line_width=2)
# 결과 출력
show(p)
x = [1, 2, 3, 4, 5]
y1 = [6, 7, 2, 4, 5]
y2 = [2, 3, 4, 5, 6]
y3 = [4, 5, 5, 7, 2]
# 한 그림에 여러가지 선 추가
p = figure(title="Multiple line example", x_axis_label="x", y_axis_label="y")
p.line(x, y1, legend_label="Temp.", color="blue", line_width=2)
p.line(x, y2, legend_label="Rate", color="red", line_width=2)
p.line(x, y3, legend_label="Objects", color="green", line_width=2)
show(p)
# prepare some data
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y = [4, 5, 5, 7, 2, 6, 4, 9, 1, 3]
# create plot with circle glyphs
p = figure(x_range=(0, 11), width=500, height=250)
points = p.circle(x=x, y=y, size=30, fill_color="#21a7df")
# set up textarea (div)
div = Div(
text="""
<p>Select the circle's size using this control element:</p>
""",
width=200, height=30
)
# set up spinner
spinner = Spinner(title="Circle size", low=0, high=60, step=5, value=points.glyph.size, width=200)
spinner.js_link("value", points.glyph, "size")
# set up RangeSlider
range_slider = RangeSlider(title="Adjust x-axis range", start=0, end=11, step=1, value=(p.x_range.start, p.x_range.end),)
range_slider.js_link("value", p.x_range, "start", attr_selector=0)
range_slider.js_link("value", p.x_range, "end", attr_selector=1)
# create layout
layout = layout([[div, spinner], [range_slider], [p],])
# show result
show(layout)
4. Plotly
df = px.data.iris()
fig = px.scatter(
df,
x="sepal_width",
y="sepal_length",
color="species",
size="petal_length",
hover_data=["petal_width"]
)
fig.show()
df = px.data.tips()
fig = px.scatter(
df, x="total_bill", y="tip", color="smoker", facet_col="sex", facet_row="time"
)
fig.show()
df = px.data.gapminder()
fig = px.scatter(
df.query("year==2007"),
x="gdpPercap", y="lifeExp", size="pop", color="continent", hover_name="country", log_x=True, size_max=60
)
fig.show()
df = px.data.gapminder().query("year == 2007")
fig = px.sunburst(
df, path = ["continent", "country"], values="pop", color="lifeExp", hover_data=["iso_alpha"]
)
fig.show()
df = px.data.carshare()
fig = px.scatter_mapbox(
df,
lat="centroid_lat",
lon="centroid_lon",
color="peak_hour",
size="car_hours",
color_continuous_scale=px.colors.cyclical.IceFire,
size_max=15,
zoom=10,
mapbox_style="carto-positron"
)
fig.show()
df = px.data.election()
fig = px.scatter_3d(
df,
x="Joly", y="Coderre", z="Bergeron", color="winner", size="total", hover_name="district", symbol="result",
color_discrete_map={"Joly":"blue", "Bergeron":"green", "Coderre":"red"}
)
fig.show()
5. Plotnine
(
ggplot(mtcars, aes("wt", "mpg", color="factor(gear)"))
+ geom_point()
+ stat_smooth(method="lm")
+ facet_wrap("~gear")
)
n = 10
df = pd.DataFrame(
{
"x": np.arange(n),
"y": np.arange(n),
"yfit": np.arange(n) + np.tile([-0.2, 0.2], n//2),
"cat": ["a", "b"] * (n//2)
}
)
(
ggplot(df)
+ geom_col(aes("x", "y", fill="cat"))
+ geom_point(aes("x", y="yfit", color="cat"))
+ geom_path(aes("x", y="yfit", color="cat"))
+ scale_color_discrete(l=0.4) # new
)
6. Pandas
공기질 = pd.read_csv('https://raw.githubusercontent.com/pandas-dev/pandas/master/doc/data/air_quality_no2.csv', engine='python')
공기질.plot(figsize=(15, 5))
plt.show()
공기질.plot.scatter(x="station_london", y="station_paris", alpha=0.5, figsize=(15, 5))
plt.show()
공기질.plot.box(figsize=(15, 5))
plt.show()
공기질.plot.area(figsize=(12, 8), subplots=True)
plt.show()
'Statistics > BSA' 카테고리의 다른 글
230501 / BSA09. pandas에서 탐색적 데이터 분석 (EDA) (0) | 2023.05.03 |
---|---|
230426 / BSA08. CO2 배출량 대시보드 시각화 (0) | 2023.05.03 |
230424 / BSA08. matplotlib 한글 처리 (0) | 2023.05.03 |
230419 / BSA05. Housing 데이터로 전처리, 회귀 모델 적용, 시각화 (0) | 2023.04.23 |
230417 / BSA05. 데이터 전처리 3 : 차원 축소 (0) | 2023.04.23 |