Pyplot 산점도 마커 크기


376

산점도에 대한 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숫자의 의미를 알고 싶습니다 .


포인트는 글꼴에 사용 된 것과 동일한 단위인지 확인하십시오.
tacaswell

@ tcaswell, 당신은 s=20마커 크기가 fontsize=20글자 의 크기와 같은 것을 의미 합니까?
LWZ

아니요, 면적은 20 포인트입니다 ^ 2, fontsize=20문자의 키는 20pt입니다 (또는 글꼴의 참조 문자의 키는 20pt입니다).
tacaswell 2019

23
matplotlib.pyplot.plot()보유 ms파라미터 ( markersize)에 대한 상응하는 matplotlib.pyplot.scatter()파라미터 s( size). 그냥 알림 ..
niekas

@neikas 하나는 픽셀 (마커 크기)이고 다른 하나는이 이상한 제곱 점 단위 (크기)이기 때문에 나에게 보이지 않습니다. 이것은 항상 혼란 스러웠지만, 시각적으로 비례하는 방식으로 양을 나타내는 데 사용되는 산점도 마커 크기와 관련이 있다고 생각합니다.
heltonbiker

답변:


406

이것은 크기를 정의하는 다소 혼란스러운 방법 일 수 있지만 기본적으로 마커 영역 을 지정합니다 . 즉, 마커의 너비 (또는 높이)를 두 배로 늘리려면 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()

2
나는 아마도 당신의 요점을 오해하고 있지만, 두 번째 예에서는 기하 급수적으로 (s = [20, 40, 80, 160, 320, 640]) 증가하고 있으며 이것이 우리에게 멋진 선형 모양의 크기 증가를 제공한다고 말합니다. 크기를 선형으로 늘리면 (예 : s = [20, 40, 60, 80, 100, 120]) 선형적인 결과를 얻었을 경우 더 의미가 없습니까?
Emma

@Emma 직감이 맞습니다. 제 말에 잘못된 표현입니다 (또는 x 축 스케일링의 선택이 좋지 않습니다). 의견이 너무 길어서 편집에서 더 설명했습니다.
Dan

1
sFigure 창의 크기에 따라 값 을 변경할 수 있습니까? 그림 창을 최대화하면 더 큰 크기 표시를 원합니다.
Sigur

2
좋은 예 (필요한 것들!). 이것은 안 4 ** n하고 2 ** n있지만, n ** 4하고 n ** 2. 와 2 ** n제 플롯 원 지름 환산의 선형 확장되지 않는다. 여전히 너무 빠릅니다 (정상적인 것은 아닙니다).
Tomasz Gandor 2016 년

1
더 짧게 말하면-두 번째 줄거리는 지수의 제곱근을 보여줍니다-이것은 또 다른 지수이며 조금 덜 가파 릅니다.
Tomasz Gandor

217

여기의 다른 답변 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() 

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


플롯의 실제 좌표에서 0.1의 지름을 덮는 원을 얻기 위해 산포하기 위해 어떤 s 매개 변수를 계산할 것인지 궁금해합니다. , 0)
Anatoly Alekseev

@AnatolyAlekseev 질문에 대답해야합니다 .
ImportanceOfBeingErnest

21

당신이 사용할 수있는 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()

에서 여기

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


문제는 산점도에 대해, 그리고하기 matplotlib에서 두 개의 플로팅 기능 (다른 매개 변수가 markersize 에 대한 플롯 에 대한 분산 ). 따라서이 답변은 적용되지 않습니다.
Dom

3
@Dom I upvoted. "pyplot plot marker size"를 검색해도이 질문이 Google의 첫 번째 결과로 표시되므로이 답변이 도움이됩니다.
Przemek D

나는 플롯 방법과 산포 방법이 plt에서 다르다는 것을 알고 있지만 둘 다 '산란 플롯'을 실현하고 마커 크기를 조정할 수 있으므로이 답변은 플롯 방법 @Dom
zhaoqing

18

마커 의 영역 입니다. 당신이 가지고 있다면 , 각 원의 반지름 사이의 관계는 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')

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

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


이것은 가장 깨끗하고 가장 뚱뚱한 무료 답변입니다. 감사합니다
Ayan Mitra

6

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

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)

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

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


매우 도움이됩니다. 그러나 왜 두 개의 루프를 사용합니까?
grabantot

1
@ grabantot 아무 이유없이, 그것에 대해 너무 많이 생각하지 않았습니다.
Ike

2

원의 크기가의 매개 변수의 제곱에 해당하는 경우 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]


1
해서는 안되는가 i in output?
Sigur
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.