matplotlib plot()

  • matplotlib의 가장 기본적인 시각화 명령은 plot()입니다.
  • 데이터를 line plot으로 표현하는 명령인데 marker만 남기면 scatter plot도 가능합니다.
  • 여러 옵션들을 한 눈에 그려봅니다.

1. Sample Data

1
2
x = np.array([2009, 2010, 2011, 2012, 2013])
y = np.array([588839, 677834, 712227, 693631, 668522])

2. plot()

matplotlib.pyplot.plot
matplotlib.axes.Axes.plot

2.1. 기본 그림

  • 기본 명령만 사용해서 그려봅니다.
1
2
fig, ax = plt.subplots(figsize=(5, 2))
ax.plot(x, y)


  • line plot이 그려집니다.

  • 그런데 plot()에는 엄청나게 많은 옵션이 있습니다.

    plot parameters (일부)

  • 이 중 알아두면 유용한 것들을 살펴봅시다.

2.2. Join styles, Cap styles

matplotlib: Join styles and cap styles

  • join style은 line plot의 꺾이는 지점 표현 방식

  • cap style은 line plot의 양 끝지점 표현 방식입니다.



  • solid_capstylesolid_joinstyle은 실선,

  • dash_capstyledash_joinstyle은 점선과 파선에 적용됩니다.

2.3. line

matplotlib.lines.Line2D
matplotlib.colors
matplotlib Linestyles

  • Line은 두께linewidth, 색상color, 스타일linestyle을 조정할 수 있습니다.

  • 각기 .plot()안에 linewidth=, color=, linestyle=로 지정하면 되는데,

  • linewidthlw, colorc, linestylels로 줄여서 넣을 수 있습니다.

  • ※ 주의 ※ linecolor가 아니라 color입니다.

    • matplotlib의 인자 이름에 통일성이 부족합니다.
    • 그 바람에 많이 헷갈리는데, color가 대표적인 사례입니다.
  • 위 세 가지 옵션을 조합해서 그림을 그려봅니다.

1
2
3
4
5
6
7
8
9
10
11
12
linewidths = [1, 3, 5]
colors = ['r', 'c', 'b', "chartreuse", "coral", "violet", '#d62728', '#9467bd', '#8c564b', "0.2", "0.5", "0.7"]
linestyles = ["-", ":", "--", "-."]

fig, axs = plt.subplots(ncols=3, figsize=(9, 2), sharex=True, sharey=True)

for i, (ax, lw) in enumerate(zip(axs, linewidths)):
for j, (y_offset, c, ls) in enumerate(zip(range(0, -80000, -20000), colors, linestyles)):
ax.plot(x, y+y_offset, lw=lw, c=colors[4*i+j], ls=ls)

axs[0].set_xlim(2009.5, 2012.5)
axs[0].set_ylim(600000, 720000)


2.4. marker

matplotlib.markers

  • marker는 line보다 옵션이 많습니다.

  • 모양marker, 크기markersize(또는 ms), 채우기 색상markerfacecolor(또는 mfc), 채우기 스타일fillstyle, 윤곽선 색상markeredgecolor(또는 mec), 윤곽선 굵기markeredgewidth(또는 mew)건너뛰기 빈도markevery까지 있습니다.

  • 이 중 marker 모양만 해도 종류가 많기 때문에 자주 쓰는 몇 개만 사용하는 것이 일반적입니다.

  • 하지만 때로 공식 홈페이지를 뒤져서 변화를 주는 것도 좋습니다.


  • line과 marker 인자를 일부를 조합해서 시각화합니다.

  • 일부라도 해도 경우의 수가 너무 많아서 random하게 조합되도록 했습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
markerstyles = ['o', 'v', '^', '<', '8', '1', '2', 'x', 's', 'p', '*', 'h', 'H', 'D', 'd', 'P', 'X']
fillstyles = ['full', 'left', 'right', 'bottom', 'top', 'none']
linestyles = ['-', '--', '-.', ':', '']
colors = ['b', 'g', 'r', 'c', 'm', 'y', 'k', 'w',
"gold", "chartreuse", "skyblue", "plum", "coral", "violet", "salmon", "aqua", "hotpink", "orchid",
'#1f77b4', '#ff7f0e', '#2ca02c', '#d62728', '#9467bd', '#8c564b', '#e377c2', '#7f7f7f', '#bcbd22', '#17becf',
"0.2", "0.5", "0.7"]

len_m = len(markerstyles)
len_f = len(fillstyles)
len_l = len(linestyles)
len_c = len(colors)

fig, axes = plt.subplots(nrows=8, ncols=8, figsize=(10, 10), sharex=True, sharey=True)
axs = axes.ravel()

for ax in axs:
marker = markerstyles[np.random.choice(len_m)]
fillstyle = fillstyles[np.random.choice(len_f)]
linestyle = linestyles[np.random.choice(len_l)]
color = colors[np.random.choice(len_c)]
mfc = colors[np.random.choice(len_c)]
mec = colors[np.random.choice(len_c)]

if color == "w" or mec == "w":
color = "w"
mec = "w"
ax.set_facecolor("0.5")

ax.plot(x, y, marker=marker,
mfc=mfc, mec=mec,
fillstyle=fillstyle, linestyle=linestyle, color=color)
ax.set_xlim(2009.5, 2012.5)
ax.set_ylim(650000, 950000)
ax.set_xticks([])
ax.set_yticks([])

for text_y, e in zip(np.arange(0.89, 0.18, -0.12), ["marker", "fillstyle", "linestyle", "color", "mfc", "mec"]):
ax.text(0.05, text_y, f"{e}='{eval(e)}'", transform=ax.transAxes, fontsize="x-small")

fig.set_facecolor("w")
fig.tight_layout()
fig.savefig("53_mpl_plot_2.png", dpi=200)


3. 결론

  • plot()은 matplotlib의 여러 기능 중 가장 자유도가 높은 명령이 아닐까 싶습니다.
  • 오늘 소개한 것 외에도 drawstyle을 이용해서 step을 만들 수도 있고 alpha를 이용해서 투명도를 조절할 수도 있습니다.
  • 선택지가 너무나 많기 때문에 대부분의 교재나 tutorial에서 극히 일부만을 소개하고 있습니다. 공식 문서를 통해 다양한 가능성을 확인해보시기 바랍니다.


도움이 되셨나요? 카페인을 투입하시면 다음 포스팅으로 변환됩니다

Share