Python/Python matplotlib

Python matplotlib : pcolormesh, cmap, colorbar (색깔 그래프, color graph)

CosmosProject 2024. 4. 2. 00:26
728x90
반응형

 

 

 

pcolormesh method는 color graph를 그릴 수 있게 해줍니다.

 

 

pcolormesh는 다음과 같이 사용할 수 있습니다.

 

import matplotlib.pyplot as plt

plt.pcolormesh(
    [
        [0, 1, 2, 3, 4],
        [1, 2, 3, 4, 5],
        [2, 3, 4, 5, 6],
        [3, 4, 5, 6, 7]
    ]
)

plt.show()

 

그러면 위같은 결과가 나옵니다.

 

import matplotlib.pyplot as plt

plt.pcolormesh(
    [
        [0, 1, 2, 3, 4],
        [1, 2, 3, 4, 5],
        [2, 3, 4, 5, 6],
        [3, 4, 5, 6, 7]
    ]
)

plt.show()

 

코드를 다시 보면

일단 pcolormesh()에 전달되는 array 또는 list는 2차원 이어야 합니다.

 

그리고 2차원 array의 각각의 숫자는 그래프에서 한 칸에 대응됩니다.

 

그래서 pcolormesh()는 각각의 숫자를 가로 1 * 세로 1 크기의 사각형에 색상으로 표시해 줍니다.

 

다만 주의해야 할 것은

    [
        [0, 1, 2, 3, 4],  -> 실제 그래프에선 가장 아래에 있는 행에 표시됨.
        [1, 2, 3, 4, 5],
        [2, 3, 4, 5, 6],
        [3, 4, 5, 6, 7]  -> 실제 그래프에선 가장 위에 있는 행에 표시됨.
    ]

 

여기서 가장 위쪽에 있는 [0, 1, 2, 3, 4] 행이 그래프에선 가장 아래쪽에 표시된다는 것입니다.

 

그래서 그래프 가장 왼쪽 아래에 가장 진한 남색이 0을 의미합니다.

반대로 그래프 가장 오른쪽 위에 노란색이 7을 의미하구요.

 

이렇게 숫자가 작을수록 무슨 색, 숫자가 클수록 무슨색 이렇게 표시해주는 것이 pcolormesh method의 기능입니다.

 

 

 

pcolormesh는 subplots에도 적용할 수 있습니다.

 

import matplotlib.pyplot as plt

fig, graph = plt.subplots(nrows=1, ncols=1)

graph.pcolormesh(
    [
        [0, 1, 2, 3, 4],
        [1, 2, 3, 4, 5],
        [2, 3, 4, 5, 6],
        [3, 4, 5, 6, 7]
    ]
)

plt.show()

 

 

 

 

 

 

 

pcolormesh에는 cmap option도 있습니다.

원하는 colormap을 사용할 수 있는 기능입니다.

 

import matplotlib.pyplot as plt
import numpy as np

values = np.random.rand(6, 10)

fig, graph = plt.subplots(nrows=1, ncols=1)
graph.pcolormesh(values, cmap='gray')

plt.show()

 

 

gray라는 colormap은 흰색~회색~검은색의 그라데이션을 나타냅니다.

따라서 위처럼 흰색~회색~검은색 계열로 나타내어진 것을 볼 수 있습니다.

 

 

 

 

 

 

colorbar를 지정하면 색상 별 값의 추정치를 알 수 있는 대조 그래프를 띄워줍니다.

 

import matplotlib.pyplot as plt
import numpy as np

values = np.random.rand(6, 10)

plt.pcolormesh(values)
plt.colorbar(shrink=1)

plt.show()

 

 

그러면 위처럼 colorbar가 옆에 생긴 것을 볼 수 있죠.

 

colorbar에는 shrink 옵션이 있는데

이것은 colorbar를 얼마만큼의 비율로 나타내 줄지를 결정하는 요소입니다.

 

 

 

 

 

 

shrink옵션을 0.8로 설정하면 아래처럼 colorbar의 크기가 80%로 축소된 것을 볼 수 있습니다.

 

import matplotlib.pyplot as plt
import numpy as np

values = np.random.rand(6, 10)

plt.pcolormesh(values)
plt.colorbar(shrink=0.8)

plt.show()

 

 

 

 

 

 

 

colorbar는 subplot에도 적용할 수 있습니다.

다만 약간의 사용 방식이 다릅니다.

 

import matplotlib.pyplot as plt
import numpy as np

values = np.random.rand(6, 10)

fig, graph = plt.subplots(nrows=1, ncols=1)
pcm = graph.pcolormesh(values, cmap='gray')
fig.colorbar(pcm, ax=graph, shrink=1)

plt.show()

 

위 코드를 보면

colorbar에 pcm이라는 변수에 담긴 pcolormesh 객체를 먼저 넣어주고,

ax=graph를 통해 graph 객체를 전달해줘서 어떤 subplot에 colorbar를 나타낼지를 정해줘야 합니다.

shrink 옵션은 동일하구요.

 

 

그러면 위처럼 colorbar가 생긴걸 볼 수 있습니다.

 

 

 

 

여러 개의 subplot 별로 colorbar를 적용하고 싶으면 아래와 같이 하면 됩니다.

 

import matplotlib.pyplot as plt
import numpy as np

values = np.random.rand(6, 10)
row_cnt = 2
col_cnt = 3

fig, graph = plt.subplots(nrows=row_cnt, ncols=col_cnt)

for r in range(row_cnt):
    for c in range(col_cnt):
        pcm = graph[r][c].pcolormesh(values, cmap='gray')
        fig.colorbar(pcm, ax=graph[r][c], shrink=1)

plt.show()

 

 

 

 

 

특정 subplot에만 colorbar를 적용할 수 있다는 사실을 잘 이용하면

아래 예시처럼 하나의 행에 하나의 colorbar만 표시할 수도 있습니다.

 

import matplotlib.pyplot as plt
import numpy as np

values = np.random.rand(6, 10)
row_cnt = 2
col_cnt = 3

fig, graph = plt.subplots(nrows=row_cnt, ncols=col_cnt)

for r in range(row_cnt):
    for c in range(col_cnt):
        pcm = graph[r][c].pcolormesh(values, cmap='gray')
    fig.colorbar(pcm, ax=graph[r][c], shrink=1)

plt.show()

 

 

 

 

 

 

 

 

또한 다음 코드와 같이 사용하면

전체 subplot에 대해 하나의 colorbar만 설정할 수도 있습니다.

 

import matplotlib.pyplot as plt
import numpy as np

values = np.random.rand(6, 10)
row_cnt = 2
col_cnt = 3

fig, graph = plt.subplots(nrows=row_cnt, ncols=col_cnt)

for r in range(row_cnt):
    for c in range(col_cnt):
        pcm = graph[r][c].pcolormesh(values, cmap='gray')
fig.colorbar(pcm, ax=graph, shrink=1)

plt.show()

 

 

 

 

 

 

728x90
반응형