Patchworklib 설명: Matplotlib의 Subplot에 대해 간략하게 설명합니다.
Matplotlib의 Subplot을 보다 쉽게 사용할 수 있습니다.
Matplotlib 파이톤에서 가장 많이 쓰이는 시각화 포장이지만 논문을 만들거나 발표할 때 사용하는 아름다운 줄거리를 만들기 위해서는 복잡한 문법을 익혀야 한다.특히 하위 그림의 기능은 매우 복잡하다고 말하기 어렵다. 자신의 이상적인 구조를 실현하기 위해 예를 들어 그림의 상자를 정렬하고 텍스트의 위치를 정렬하며 몇 개의 하위 그림에 대해 공통된 제목을 설정하는 등이다.때때로 몇 백 줄의 코드를 써야 한다.
또한 matplotlib에 있는 하위 그림의 함수를 실현하고 상호작용 프로그래밍 환경(예를 들어 Juptyner-lab)에서 하위 그림의 레이아웃을 순서대로 확인하여 전체 Figure의 레이아웃을 미리 정하도록 강제할 수 있다.수정할 수 없습니다. (matplotlibv3.4에서 실시하는subplotmosiac 함수를 사용하면subplot의 레이아웃을 간단하게 정의할 수 있지만, 그래도 한 번에 결정하는 레이아웃을 수정하기는 쉽지 않습니다.)
또한 Seaborn와plotnine처럼 훌륭한 데이터 시각화 패키지가 있는데 몇 줄의 Python 코드로 아름다운 그림을 만들 수 있지만 두 가방이 만들어낸 그림에서matplotlib의 하위 줄거리로 처리할 수 없는 것이 있습니다. (두 포장은 모두 matplotlib을 바탕으로 이루어진 것입니다.)
따라서 여러 드로잉을 구성한 경우 결국 subplot 기능을 사용하지 않고 키노트, 파워포인트, 일러스트레이터 등 다른 GUI 소프트웨어를 사용해 수동으로 구성하는 경우가 많죠?하지만 이런 일은 매우 힘든 일이다.또한 수동으로 편집하는 부분이 많을수록visualizaaiton의 재현성이 낮아지고 레이아웃을 수정하는 것도 어려워진다.
이러한 문제점을 해결하기 위해 최근에 새로운 하위 그림 관리자patchworklib를 개발했습니다. 이것은 여러 개의 matplotlib 그림
|
과 /
연산자를 사용하여 신속하게 설정할 수 있습니다.Patchworklib 사용 방법
patchworklib 모듈은 matplotlib입니다.axes.Axes 클래스의 하위 클래스로 구현되는 Brick 클래스를 제공합니다.각 Brick 클래스 객체는 다른 Brick 클래스 객체와 | 또는 연산자를 조합할 수 있습니다.따라서 patchworklib을 사용하면 아래의 간단한 Python 코드와 같은 두 개의 하위 그림을 신속하게 설정할 수 있습니다.
import patchworklib as pw
ax1 = pw.Brick(figsize=(3,3))
ax2 = pw.Brick(figsize=(1,3))
ax1.set_title("ax1")
ax2.set_title("ax2")
ax12 = ax1|ax2
ax12.savefig()
아주 간단합니다.ax1과 ax2 사이의 위치를 바꾸는 레이아웃을 즉시 시도할 수 있습니다.
ax12 = ax2|ax1
ax12.savefig()
그리고 matplotlib으로 하려면 어려워요.subplot에 공통된 xlabel,ylable 등을 간단하게 추가할 수 있어요.
ax12.set_supspine("bottom")
ax12.set_supxlabel("hoge")
ax12.savefig()
물론 이렇게 하는 Figure도 다른 Figure와 간단하게 결합할 수 있다.
ax3 = pw.Brick(figsize=(2,1))
ax4 = pw.Brick(figsize=(2,2))
ax3.set_title("ax3")
ax4.set_title("ax4")
ax34 = ax3/ax4
(ax12|ax34).savefig()
이제 두 Fig의 크기가 자동으로 조정되어 경계가 일치합니다.그러나 사람에 따라 테두리가 아닌 Figure의 문자 가장자리를 맞추려는 사람도 있다.그것도 간단해.
(ax12.outline|ax34.outline).savefig()
당신은 그림의 크기가 그림의 테두리가 아니라 외부 문자의 가장자리를 일치시키기 위해 조정한 것을 아십니까?이런 느낌으로patchworklib은subplot의 레이아웃을 간단하게 조정할 수 있다.
Seabrn plot을 정렬합니다.
좀 더 복잡한 그림을 만들면, 그림이 겹치지 않습니까?그런 일 없습니다.
그럼 단순 seaburn의 plot 몇 개를 배열해 봅시다.
import seaborn as sns
import patchworklib as pw
#ax1
ax1 = pw.Brick("ax1", figsize=(3,2))
fmri = sns.load_dataset("fmri")
sns.lineplot(x="timepoint", y="signal", hue="region", style="event", data=fmri, ax=ax1)
ax1.move_legend(new_loc='upper left', bbox_to_anchor=(1.05, 1.0))
ax1.set_title("ax1")
#ax2
ax2 = pw.Brick("ax2", figsize=(1,2))
titanic = sns.load_dataset("titanic")
sns.barplot(x="sex", y="survived", hue="class", data=titanic, ax=ax2)
ax2.move_legend(new_loc='upper left', bbox_to_anchor=(1.05, 1.0))
ax2.set_title("ax2")
#ax3
ax3 = pw.Brick("ax3", (5,2))
diamonds = sns.load_dataset("diamonds")
sns.histplot(diamonds, x="price", hue="cut", multiple="stack", palette="light:m_r", edgecolor=".3", linewidth=.5, log_scale=True, ax = ax3)
ax3.move_legend(new_loc='upper left', bbox_to_anchor=(1.0, 1.0))
ax3.set_title("ax3")
#ax4
ax4 = pw.Brick("ax4", (6,2))
tips = sns.load_dataset("tips")
sns.violinplot(data=tips, x="day", y="total_bill", hue="smoker",split=True, inner="quart", linewidth=1, palette={"Yes": "b", "No": ".85"}, ax=ax4)
ax4.move_legend("upper left", bbox_to_anchor=(1.02, 1.0))
ax4.set_title("ax4")
#ax5
ax5 = pw.Brick("ax5", (5,2))
rs = np.random.RandomState(365)
values = rs.randn(365, 4).cumsum(axis=0)
dates = pd.date_range("1 1 2016", periods=365, freq="D")
data = pd.DataFrame(values, dates, columns=["A", "B", "C", "D"])
data = data.rolling(7).mean()
sns.lineplot(data=data, palette="tab10", linewidth=2.5, ax=ax5)
ax5.set_xlabel("date")
ax5.set_ylabel("value")
ax5.move_legend("upper left", bbox_to_anchor=(1.02, 1.0))
ax5.set_title("ax5")
#patchwork
ax35421 = (ax3/ax4)|(ax5/(ax2|ax1))
ax35421.savefig()
결과는 이와 같다.legend의 위치도 잘 검사하고 그림이 겹치지 않으며 테두리가 가지런하게 자동으로 설정됩니다.
Figulevel의 Seabrn plot을 나열합니다.
단도직입적으로 말하자면 상술한 레이아웃은pathckworldib를 사용하지 않더라도Matplotlib과Seabon을 사용해도 해낼 수 없을 것이다.상술한 seaboln plot은 모두 Axes-level의 plot이기 때문에 Matplotlib의 Subplot으로 사용할 수 있다.그러나 씨버른의 plot에는 Figure 전체를 활용한다는 전제로 제작된 Figulevel의 plot이 존재한다.Seabrn에서 Figure-level과Axes-level의 차이를 알고 싶은 사람은 영어로 다음 페이지를 참고하세요.
이렇게 Figure-level plot을 나열하는 방법은 지금까지 기본적으로 수동 외에 다른 방법이 없었다.다만, 패치워크리브는 피그-level의 plot을 Axes-level의 plot으로 변환하는 기능이 있으므로 아래의 피그어 제작도 다과를 선택해달라.
import seaborn as sns
import patchworklib as pw
pw.overwrite_axisgrid() #When you use pw.load_seagorngrid, the 'overwrite_axisgrid' method should be executed.
#g1
df = sns.load_dataset("penguins")
g1 = sns.pairplot(df, hue="species")
g1 = pw.load_seaborngrid(g1)
g1.move_legend("upper left", bbox_to_anchor=(0.17,1.01))
#g2
planets = sns.load_dataset("planets")
cmap = sns.cubehelix_palette(rot=-.2, as_cmap=True)
g2 = sns.relplot(data=planets, x="distance", y="orbital_period", hue="year", size="mass", palette=cmap, sizes=(10, 200))
g2.set(xscale="log", yscale="log")
g2.ax.xaxis.grid(True, "minor", linewidth=.25)
g2.ax.yaxis.grid(True, "minor", linewidth=.25)
g2.despine(left=True, bottom=True)
g2 = pw.load_seaborngrid(g2)
#g3
penguins = sns.load_dataset("penguins")
g3 = sns.jointplot(data=penguins,x="bill_length_mm", y="bill_depth_mm", hue="species", kind="kde")
g3 = pw.load_seaborngrid(g3, labels=["joint","marg_x","marg_y"])
#patchwork
((g2.outline/g3.outline)|g1).savefig()
이로써 patchworldib의 창작자(필자)는 천재일 가능성이 높다.근데 일이 없어서 유감입니다.(거짓말, 난 좀 꽉 찬 척했어. 난 무한회랑에 빠진 박사과정 x학년 학생이야.)
정렬
여기까지 읽은 사람들은 이미 알아차렸을 것이다. 그렇다.patchworklib은 gplot의subplot 라이브러리patchwork의 산채입니다.단도직입적으로python,matplotlib이 아니라 R,gplot으로 해석하는 사람은 본가의 patchwork를 사용하면 100배 행복할 것이다.
그러나 Juptyterlab, Googlecolab 같은 사회에는python 이외에 그다지 받아들여지지 않는 환경이 많다.gplot을 가장 좋아하는 여러분도 matplotib를 사용할 수밖에 없을 때가 있죠.그런 너의 구세주.바로 plotnine입니다.matplotlib을 바탕으로 ggplot의syntax를 완전히 실현한 무서운 프로그램 라이브러리입니다.하지만 큰 단점이 있다.그것은 본가patchwork에 해당하는 라이브러리가 없고subplot의 기능이 완전히 실현되지 않았다는 것이다.
하지만 이미 문제 없어요.patchwork의 표절 patchworklib을 사용하면 plotnine의 plot도 아래와 같이 간단하게 배열할 수 있습니다.이렇게 하면 matplotlib과 seabon의 plot와 함께 배열할 수 있다.
import patchworklib as pw
from plotnine import *
from plotnine.data import *
g1 = (ggplot(mtcars) + geom_point(aes("mpg", "disp")))
g1 = pw.load_ggplot(g1, figsize=(2,3))
g2 = (ggplot(mtcars) + geom_boxplot(aes("gear", "disp", group="gear")))
g2 = pw.load_ggplot(g2, figsize=(2,3))
g3 = (ggplot(mtcars, aes('wt', 'mpg', color='factor(gear)')) + geom_point() + stat_smooth(method='lm') + facet_wrap('~gear'))
g3 = pw.load_ggplot(g3, figsize=(3,3))
g4 = (ggplot(data=diamonds) + geom_bar(mapping=aes(x="cut", fill="clarity"), position="dodge"))
g4 = pw.load_ggplot(g4, figsize=(5,2))
#patchwork
g1234 = (g1|g2|g3)/g4
g1234.savefig()
여기까지 읽어주신 여러분, 감사합니다.스타가 지혁이 녹음해 주면 좋겠다.
그리고 문서 작성을 도와주는 사람이 있다면 기쁠 거예요.
솔직히 말하면, 설치만 하면 질린다
여기 설명된 코드는 아래 Googlecolab에서 실제로 실행할 수 있습니다.관심 있는 사람은 만져보세요.
tutorial : Basic example codes of patchworklib
subplot4plotnine : Arranging plotnine plots using patchworklib
subplot4seaborngrid : Arranging figure level seaborn plots using patchworklib
Reference
이 문제에 관하여(Patchworklib 설명: Matplotlib의 Subplot에 대해 간략하게 설명합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/ponnhide/articles/40ac7dbe0aa4ab텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)