[matplotlib] Pyplot 산점도 마커 크기

산점도에 대한 pyplot 문서에서 :

matplotlib.pyplot.scatter(x, y, s=20, c='b', marker='o', cmap=None, norm=None,
                          vmin=None, vmax=None, alpha=None, linewidths=None,
                          faceted=True, verts=None, hold=None, **kwargs)

마커 크기

s : 포인트 단위 ^ 2. 스칼라 또는 x 및 y와 같은 길이의 배열입니다.

어떤 종류의 단위 points^2입니까? 무슨 뜻이에요? 않음 s=100을 의미 10 pixel x 10 pixel?

기본적으로 마커 크기가 다른 산점도를 만들려고하는데 s숫자의 의미를 알고 싶습니다 .



답변

이것은 크기를 정의하는 다소 혼란스러운 방법 일 수 있지만 기본적으로 마커 영역 을 지정합니다 . 즉, 마커의 너비 (또는 높이)를 두 배로 늘리려면 s4 를 늘려야 합니다. [A = W H => (2W) (2H) = 4A]

그러나 마커의 크기가 이런 식으로 정의되는 이유가 있습니다. 너비의 제곱으로 영역의 크기를 조정하기 때문에 너비를 두 배로 늘리면 실제로 크기가 2보다 크게 증가합니다 (실제로 4 배 증가 함). 이를 확인하려면 다음 두 가지 예와 그 결과를 고려하십시오.

# doubling the width of markers
x = [0,2,4,6,8,10]
y = [0]*len(x)
s = [20*4**n for n in range(len(x))]
plt.scatter(x,y,s=s)
plt.show()

준다

여기에 이미지 설명을 입력하십시오

크기가 매우 빠르게 증가하는 것을 주목하십시오. 대신에 우리는

# doubling the area of markers
x = [0,2,4,6,8,10]
y = [0]*len(x)
s = [20*2**n for n in range(len(x))]
plt.scatter(x,y,s=s)
plt.show()

준다

여기에 이미지 설명을 입력하십시오

이제 마커의 겉보기 크기는 직관적 인 방식으로 대략 선형으로 증가합니다.

‘포인트’가 무엇인지에 대한 정확한 의미는 플로팅 목적으로 상당히 임의적이며, 합리적인 것처럼 보일 때까지 모든 크기를 일정하게 조정할 수 있습니다.

도움이 되었기를 바랍니다!

편집 : (@Emma의 의견에 대한 답변으로)

아마도 내 생각에 혼란스러운 말일 것이다. 이 질문은 원의 너비를 두 배로 늘려서 각 원의 첫 번째 그림에서 (왼쪽에서 오른쪽으로 움직일 때) 너비가 이전 너비의 두 배이므로 너비가 기수 4의 지수입니다. 각 원은 마지막 두 배의 면적을 가지므로 밑이 2 인 지수를 제공합니다.

그러나 두 배의 영역이 원을 눈보다 두 배 크게 만드는 것으로 보이는 것은 두 번째 예 (확대 영역)입니다. 따라서 원이 n더 큰 계수로 나타나 n도록하려면 반지름이 아닌 계수만큼 면적을 늘리면 겉보기 크기가 면적과 선형으로 비례합니다.

@TomaszGandor의 주석을 시각화하도록 편집하십시오 .

이것은 마커 크기의 다른 기능에 대한 모양입니다.

지수, 정사각형 또는 선형 크기

x = [0,2,4,6,8,10,12,14,16,18]
s_exp = [20*2**n for n in range(len(x))]
s_square = [20*n**2 for n in range(len(x))]
s_linear = [20*n for n in range(len(x))]
plt.scatter(x,[1]*len(x),s=s_exp, label='$s=2^n$', lw=1)
plt.scatter(x,[0]*len(x),s=s_square, label='$s=n^2$')
plt.scatter(x,[-1]*len(x),s=s_linear, label='$s=n$')
plt.ylim(-1.5,1.5)
plt.legend(loc='center left', bbox_to_anchor=(1.1, 0.5), labelspacing=3)
plt.show()


답변

여기의 다른 답변 s은 마커의 영역 을 나타내는 것으로 주장하기 때문에 이것이 반드시 그런 것은 아니라는 것을 분명히하기 위해이 답변을 추가하고 있습니다.

포인트 크기 ^ 2

의 인수 s는을 plt.scatter나타냅니다 markersize**2. 문서가 말했듯이

s: 스칼라 또는 array_like, 모양 (n,), 선택적
크기는 포인트 ^ 2입니다. 기본값은 rcParams [ ‘lines.markersize’] ** 2입니다.

이것은 문자 그대로 취할 수 있습니다. x 포인트가 큰 마커를 얻으려면 해당 숫자를 제곱하여 s인수에 제공해야합니다 .

따라서 선 그림의 마커 크기와 산란 크기 인수의 관계는 제곱입니다. 크기가 10 포인트 인 플롯 마커와 동일한 크기의 산점 마커를 생성하려면을 호출 scatter( .., s=100)합니다.

여기에 이미지 설명을 입력하십시오

import matplotlib.pyplot as plt

fig,ax = plt.subplots()

ax.plot([0],[0], marker="o",  markersize=10)
ax.plot([0.07,0.93],[0,0],    linewidth=10)
ax.scatter([1],[0],           s=100)

ax.plot([0],[1], marker="o",  markersize=22)
ax.plot([0.14,0.86],[1,1],    linewidth=22)
ax.scatter([1],[1],           s=22**2)

plt.show()

“지역”에 연결

그렇다면 왜 다른 답변과 문서조차도 s매개 변수 와 관련하여 “영역”에 대해 말하는가 ?

물론 포인트 단위 ** 2는 영역 단위입니다.

  • 정사각형 마커의 특수한 경우, 마커 marker="s"의 영역은 실제로 s매개 변수 의 값입니다 .
  • 원의 경우 원의 넓이는 area = pi/4*s입니다.
  • 다른 마커의 경우 마커 영역과 명확한 관계가 없을 수도 있습니다.

여기에 이미지 설명을 입력하십시오

그러나 모든 경우에 마커의 면적은 s파라미터에 비례합니다 . 이것은 대부분의 경우 실제로는 아니지만 “지역”이라고 부르는 동기입니다.

마커의 면적에 비례하는 일부 양으로 산란 마커의 크기를 지정하는 것은 측면 길이 또는 직경이 아닌 다른 패치를 비교할 때 인식되는 마커의 면적과 같은 의미가있다. 즉, 기본 수량을 두 배로 늘리면 마커 면적이 두 배가됩니다.

여기에 이미지 설명을 입력하십시오

포인트 란?

지금까지 산란 마커의 크기가 의미하는 바에 대한 대답은 포인트 단위로 제공됩니다. 포인트는 종종 글꼴이 포인트로 지정되는 타이포그래피에서 사용됩니다. 또한 선폭은 종종 포인트로 지정됩니다. matplotlib의 표준 포인트 크기는 인치당 72 포인트 (ppi)입니다. 따라서 1 포인트는 1/72 인치입니다.

포인트 대신 픽셀 단위로 크기를 지정할 수 있으면 유용 할 수 있습니다. 그림 dpi도 72이면 한 점은 한 픽셀입니다. 그림 dpi가 다른 경우 (matplotlib 기본값은 fig.dpi=100)

1 point == fig.dpi/72. pixels

스 캐터 마커의 포인트 크기는 그림 dpi에 따라 다르게 보일 수 있지만 10 x 10 픽셀 ^ 2 마커를 생성 할 수 있습니다.이 마커는 항상 같은 수의 픽셀을가집니다.

여기에 이미지 설명을 입력하십시오
여기에 이미지 설명을 입력하십시오
여기에 이미지 설명을 입력하십시오

import matplotlib.pyplot as plt

for dpi in [72,100,144]:

    fig,ax = plt.subplots(figsize=(1.5,2), dpi=dpi)
    ax.set_title("fig.dpi={}".format(dpi))

    ax.set_ylim(-3,3)
    ax.set_xlim(-2,2)

    ax.scatter([0],[1], s=10**2,
               marker="s", linewidth=0, label="100 points^2")
    ax.scatter([1],[1], s=(10*72./fig.dpi)**2,
               marker="s", linewidth=0, label="100 pixels^2")

    ax.legend(loc=8,framealpha=1, fontsize=8)

    fig.savefig("fig{}.png".format(dpi), bbox_inches="tight")

plt.show() 

데이터 단위의 분산에 관심이 있다면 이 답변을 확인 하십시오 .


답변

당신이 사용할 수있는 markersize 를 사용하여 플롯 방법에서 원의 크기를 지정할

import numpy as np
import matplotlib.pyplot as plt

x1 = np.random.randn(20)
x2 = np.random.randn(20)
plt.figure(1)
# you can specify the marker size two ways directly:
plt.plot(x1, 'bo', markersize=20)  # blue circle with size 10 
plt.plot(x2, 'ro', ms=10,)  # ms is just an alias for markersize
plt.show()

에서 여기

여기에 이미지 설명을 입력하십시오


답변

마커 의 영역 입니다. 당신이 가지고 있다면 , 각 원의 반지름 사이의 관계는 s1 = 1000다음과 s2 = 4000같습니다 r_s2 = 2 * r_s1. 다음 플롯을 참조하십시오.

plt.scatter(2, 1, s=4000, c='r')
plt.scatter(2, 1, s=1000 ,c='b')
plt.scatter(2, 1, s=10, c='g')

여기에 이미지 설명을 입력하십시오

게시물을 볼 때도 똑같은 의심이 있었 으므로이 예제를 수행 한 다음 화면의 눈금자를 사용하여 반지름을 측정했습니다.


답변

또한이 목적을 위해 처음에는 ‘산란’을 사용하려고했습니다. 약간의 시간 낭비 후-나는 다음 해결책에 정착했습니다.

import matplotlib.pyplot as plt
input_list = [{'x':100,'y':200,'radius':50, 'color':(0.1,0.2,0.3)}]
output_list = []
for point in input_list:
    output_list.append(plt.Circle((point['x'], point['y']), point['radius'], color=point['color'], fill=False))
ax = plt.gca(aspect='equal')
ax.cla()
ax.set_xlim((0, 1000))
ax.set_ylim((0, 1000))
for circle in output_list:
   ax.add_artist(circle)

여기에 이미지 설명을 입력하십시오

이것은 이 질문 에 대한 답변을 기반으로합니다.


답변

원의 크기가의 매개 변수의 제곱에 해당하는 경우 s=parameter다음과 같이 크기 배열에 추가하는 각 요소에 제곱근을 할당 s=[1, 1.414, 1.73, 2.0, 2.24]합니다. 선형 진행을 반환하는 제곱 진행의 제곱근

플롯에 출력을 얻을 때 각각을 제곱해야한다면 : output=[1, 2, 3, 4, 5]. 목록 해석을 시도하십시오.s=[numpy.sqrt(i) for i in s]


답변