matplotlib에서 marker="."보다 작은 점 플롯

16342 단어 matplotlib

결론


s 파라미터가 마커 크기를 설정하는 파라미터입니다.plt.scatter(x, y, marker=".", s=1, linewidths=0)

s 파라미터를 놓치고 있어 여러가지 왕따 돌고 있었습니다. 코멘트로 하는 방법을 가르쳐 주셨으므로 이 기사의 내용은 이것으로 끝입니다.

유물



부끄럽지만 시행 착오의 이력은 남겨 둡니다. 좀처럼 이상한 마커를 플롯하고 싶을 때 도움이 될지도 모릅니다.

클릭하여 확장

요약



제목대로. 하려고 하면 좀처럼 방법을 찾을 수 없었기 때문에.
결론만 읽고 싶은 사람은 결론 축을 사용한 방법
조사하고 있으면 제대로 된 방법이 발견되었으므로 갱신했습니다 2020/03/19/21:29

이전 프리



Python의 그래프 드로잉 라이브러리 matplotlib에서 산점도를 그릴 때 매우 세밀한 점을 부왓과 늘어놓고 싶을 때가 있지요.plt.scatter 의 마커는 marker 파라미터로 지정할 수 있어 세세한 점을 칠 때는 marker='.' 로 합니다. ( ※ matplotlib.pyplot.scatter )
그러나 이 '.' 의 마커(문서의 description에서는 「point」라고 불리고 있습니다), 이것으로도 아직 조금 큰 생각이 듭니다.
rand = lambda n:[np.random.rand() for _ in range(n)]
xy = (rand(100), rand(100))

plt.scatter(*xy, marker=".")



마커 테두리를 지웁시다.
plt.scatter(*xy, marker=".", linewidth=0)



약간 작아진 것 같습니다만 이것으로도 아직 큰 생각이 듭니다. 더 쓰레기 같은 점이 치고 싶다.

matplotlib.markers 에 대한 설명을 읽으면 "",": :pixel"이라는 것이 있습니다. 그래 그래, 픽셀 단위 레벨의 점이 치고 싶었던 것입니다.
plt.scatter(*xy, marker=",")



왜 이렇게 됐어…
아무래도 사이즈가 규격화되어 ​​있는 것 같고, 형태를 지정하면 이 사이즈 가득이 되도록 확대 축소되는 것 같습니다.

결론 귀찮은 예



마커 사이즈의 규격화를 무효로 하는 파라미터를 찾을 수 없었기 때문에, 망식적으로 「규격화되어도 작게 보이는 마커」를 만들어 보겠습니다. (직접 마커 크기를 지정할 수 있는 방법을 아시는 분은 가르쳐 주세요 m(_ _)m)( Axes를 사용한 예 에)marker 파라미터에 「2차원 좌표의 튜플의 배열」을 주는 것으로 임의의 다각형을 그릴 수가 있습니다.
이것을 이용해 폭 제로의 대각선을 당겨 사이즈를 확보하고 나서 중심에 작은 사각형을 만듭니다.

(이런)
t = 0.1
plt.scatter(*xy, marker=[(0,0), (-1,-1), (1,1), (0,0), (t,t), (-t,t), (-t,-t), (t,-t), (t,t), (0,0)], linewidths=0)



쓰레기 같은 점을 치는 데 성공했습니다!

마커 오브젝트를 만들어 0~1배의 임의의 사이즈의 점을 치도록 해 보았습니다.
from matplotlib.markers import MarkerStyle
dot = lambda t: MarkerStyle([(0,0), (-1,-1), (1,1), (0,0), (t,t), (-t,t), (-t,-t), (t,-t), (t,t), (0,0)])
plt.scatter(*xy, marker=dot(0.2), linewidths=0)



솔직히 더 괜찮은 방법이 있을까… 잘 부탁드립니다.

축을 사용한 방법


Axes.plot 에서는 Line2D 매개 변수를 지정할 수 있으며 여기에 markersize 가 있다는 것을 알았습니다.
fig, ax = plt.subplots()
ax.plot(*xy, linestyle='none', marker=',', markersize=1)



이것이 가장 괜찮은 방법이라고 생각합니다.

조금 까다로운 일을 하려고 한다면 역시 객체 지향 인터페이스를 사용해야 합니다.
이 기사가 도움이됩니다. 빨리 알아두고 싶었던 matplotlib의 기초 지식, 혹은 외형의 조정이 끝나는 Artist의 이야기 @skotaro


※작은 점에서 하고 싶었던 것



이렇게 농담을 점의 밀도로 표현하고 싶었습니다.
func = lambda x,y:np.sin(x*np.pi)**2 * np.exp(-y**2/2)
n = 100
dx = 0.02
xlin = np.arange(-2,2,dx)
ylin = np.arange(-2,2,dx)
xx, yy = np.meshgrid(xlin, ylin)
pltx, plty = [], []
for x, y in zip(xx.flatten(), yy.flatten()):
    dense = func(x+dx/2, y+dx/2)
    pltx += [x+np.random.rand()*dx for _ in range(int(dense*n))]
    plty += [y+np.random.rand()*dx for _ in range(int(dense*n))]

plt.scatter(pltx, plty, s=0.01, marker='.', alpha=0.1)
plt.xlim(-2,2)
plt.ylim(-2,2)
plt.show()


(쓸데없이 굉장히 무겁기 때문에 컬러 맵으로 하는 것이 좋다고 생각합니다.)

좋은 웹페이지 즐겨찾기