Mpld3: ENH: twinx/twinyκ°€ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

에 λ§Œλ“  2014λ…„ 05μ›” 07일  Β·  17μ½”λ©˜νŠΈ  Β·  좜처: mpld3/mpld3

twinx/twinyκ°€ μ˜ˆμƒλŒ€λ‘œ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 이것이 TODO λͺ©λ‘μ— μžˆλ‹€λŠ” 것을 μ•Œκ³  μžˆμ§€λ§Œ 아직 이에 λŒ€ν•œ λ―Έν•΄κ²° λ¬Έμ œκ°€ μ—†μŠ΅λ‹ˆλ‹€.

λ§ˆμ§€λ§‰ 데이터 μ„ΈνŠΈλ§Œ 그렀진 것 κ°™μŠ΅λ‹ˆλ‹€. λ‹€μŒ 은 곡식 μ˜ˆμž…λ‹ˆλ‹€.

mpld3λŠ” λ‹€μŒμ„ λ°˜ν™˜ν•©λ‹ˆλ‹€.
image

tk-aggλŠ” λ‹€μŒμ„ λ°˜ν™˜ν•©λ‹ˆλ‹€.
image

μž¬ν˜„ν•  μ½”λ“œ

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import mpld3
mpld3.enable_notebook()

fig, ax1 = plt.subplots()
t = np.arange(0.01, 10.0, 0.01)
s1 = np.exp(t)
ax1.plot(t, s1, 'b-')
ax1.set_xlabel('time (s)')
# Make the y-axis label and tick labels match the line color.
ax1.set_ylabel('exp', color='b')
for tl in ax1.get_yticklabels():
    tl.set_color('b')


ax2 = ax1.twinx()
s2 = np.sin(2*np.pi*t)
ax2.plot(t, s2, 'r.')
ax2.set_ylabel('sin', color='r')
for tl in ax2.get_yticklabels():
    tl.set_color('r')
plt.show()

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

두 번째 μΆ•μ˜ 배경에 μ•ŒνŒŒλ₯Ό μ„€μ •ν•˜μ—¬ 문제λ₯Ό ν”Όν–ˆμŠ΅λ‹ˆλ‹€.

ax2.patch.set_alpha(0.0)

λͺ¨λ“  17 λŒ“κΈ€

κΈ°λŠ₯ μ•„λž˜μ˜ PS λ§ˆμ§€λ§‰ 글머리 기호 "λΈŒλŸ¬μ‹œ 및 μƒμž ν™•λŒ€/μΆ•μ†Œμ™€ 같은 μΆ”κ°€ μƒν˜Έ μž‘μš© 도ꡬ"λŠ” μƒμž ν™•λŒ€/μΆ•μ†Œ 및 λΈŒλŸ¬μ‹±μ΄ λͺ¨λ‘ κ΅¬ν˜„λ˜μ–΄ μžˆμœΌλ―€λ‘œ μ‚­μ œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

κ°μ‚¬ν•©λ‹ˆλ‹€. 이 λ¬Έμ œλŠ” κ½€ μ˜€λž«λ™μ•ˆ λ―Έν•΄κ²° λ¬Έμ œκ°€ 될 것이라고 μƒκ°ν•©λ‹ˆλ‹€... 이 문제λ₯Ό μˆ˜μ •ν•˜λ €λ©΄ νŒ¨ν‚€μ§€μ— λŒ€ν•œ λͺ‡ 가지 맀우 근본적인 변경이 ν•„μš”ν•©λ‹ˆλ‹€.

ν˜ΈκΈ°μ‹¬μ—μ„œ: d3.js, mplexporter λ˜λŠ” mpld3에 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆκΉŒ?

κ²½κ³ κ°€ 좔가될 수 μžˆμŠ΅λ‹ˆκΉŒ? (Twinx xλŠ” 아직 κ΅¬ν˜„λ˜μ§€ μ•ŠμŒ)

흠, λ˜λŠ” 더 쒋은 점은 였λ₯Έμͺ½μ˜ ν”„λ ˆμž„ 눈금이 μ„ νƒλ˜κΈ° λ•Œλ¬Έμ— μ•„λ§ˆλ„ 첫 번째(μ™Όμͺ½ μΆ•)에 크기가 μ‘°μ •λœ νŒŒλž€μƒ‰ 선을 κ·Έλ € 이λ₯Ό κ°€μ§œλ‘œ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€. 내일 μ‹œλ„ν•©λ‹ˆλ‹€...

κ²½κ³ λŠ” 쒋은 생각이 될 κ²ƒμž…λ‹ˆλ‹€. mplexporter/exporter.py μ—μ„œ λ°œμƒν•΄μ•Ό ν•©λ‹ˆλ‹€. Axes κ°μ²΄μ—μ„œ 이것을 κ°€μž₯ 잘 κ°μ§€ν•˜λŠ” 방법을 잘 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€. μ•„λ§ˆλ„ 이것을 κ΅¬ν˜„ν•˜λŠ” 방법을 μ•Œμ•„λ‚΄λŠ” 첫 번째 λ‹¨κ³„λŠ” κ²½κ³ κ°€ μžˆμ„ λ•Œ κ²½κ³ λ₯Ό λ°œμƒμ‹œν‚€λŠ” 방법을 μ•Œμ•„λ‚΄λŠ” κ²ƒμž…λ‹ˆλ‹€!

twinx() 및 twiny() λŠ” μ›λž˜ μΆ•κ³Ό 같은 μœ„μΉ˜μ— μžˆλŠ” μΆ”κ°€ 좕을 μƒμ„±ν•©λ‹ˆλ‹€. 두 좕이 μŒμΈμ§€ μ—¬λΆ€λ₯Ό κ°μ§€ν•˜λŠ” 것은 그리 어렡지 μ•ŠμŠ΅λ‹ˆλ‹€.

import numpy as np
import matplotlib.pyplot as plt


fig = plt.figure()
ax1 = fig.add_subplot(1,2,1)
ax2 = fig.add_subplot(1,2,2)

t = np.arange(0.01, 10.0, 0.01)
s1 = np.exp(t)
ax1.plot(t, s1, 'b-')
ax1.set_xlabel('time (s)')
# Make the y-axis label and tick labels match the line color.
ax1.set_ylabel('exp', color='b')
for tl in ax1.get_yticklabels():
    tl.set_color('b')


ax3 = ax1.twinx()
s2 = np.sin(2*np.pi*t)
ax3.plot(t, s2, 'r.')
ax3.set_ylabel('sin', color='r')
for tl in ax3.get_yticklabels():
    tl.set_color('r')

print ax1.get_shared_x_axes().joined(ax1, ax2)
print ax1.get_shared_x_axes().joined(ax1, ax3)

print ax2.get_shared_x_axes().joined(ax2, ax1)
print ax2.get_shared_x_axes().joined(ax2, ax3)

print ax3.get_shared_x_axes().joined(ax3, ax1)
print ax3.get_shared_x_axes().joined(ax3, ax2)

plt.show()

두 좕이 λ‹¨μˆœνžˆ μŠ€νƒλ˜μ–΄ μžˆλ‹€λŠ” 점을 κ°μ•ˆν•  λ•Œ λͺ¨λ“  것이 D3으둜 μ „λ‹¬λœλ‹€κ³  κ°€μ •ν–ˆμŠ΅λ‹ˆλ‹€. D3은 λ‹¨μˆœνžˆ μ„œλ‘œμ˜ μœ„μ— 두 좕을 κ·Έλ¦½λ‹ˆλ‹€. λ‚˜λŠ” 이것을 κ°„λ‹¨ν•œ ν”ŒλŸ¬κ·ΈμΈμœΌλ‘œ ν™•μΈν–ˆκ³  이것이 μ‹€μ œλ‘œ κ·Έλ ‡μŠ΅λ‹ˆλ‹€. μ§€μˆ˜ Line2D와 sin Line2DλŠ” λͺ¨λ‘ D3 μͺ½μ— μ‘΄μž¬ν•©λ‹ˆλ‹€. 사싀 D3 μͺ½μ˜ 그림은 2개의 좕을 가지고 μžˆμŠ΅λ‹ˆλ‹€. 이것은 λ˜ν•œ 틱이 μ˜¬λ°”λ₯΄κ²Œ λ Œλ”λ§λ˜λŠ” 이유λ₯Ό μ„€λͺ…ν•©λ‹ˆλ‹€. κ·Έ μœ„μ— 그렀진 두 번째 μΆ•μ—λŠ” 아무 것도 μ—†μŠ΅λ‹ˆλ‹€.

두 좕이 λͺ¨λ‘ κ·Έλ €μ§€μ§€λ§Œ ν•˜λ‚˜λŠ” λ‹€λ₯Έ μΆ• μœ„μ— μžˆμŠ΅λ‹ˆλ‹€. 뢈투λͺ…ν•œ 흰색 배경이 있기 λ•Œλ¬Έμ— μ•„λž˜μͺ½ μΆ•μ˜ λ‚΄μš©μ΄ μˆ¨κ²¨μ§‘λ‹ˆλ‹€. λ˜ν•œ 마우슀 μ΄λ²€νŠΈλŠ” μ’Œν‘œμΆ• μš”μ†Œλ₯Ό 톡해 μ „νŒŒλ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 맨 μœ„ μΆ•λ§Œ ν™•λŒ€/μΆ•μ†Œμ— μ‘λ‹΅ν•©λ‹ˆλ‹€.

이 문제λ₯Ό ν•΄κ²°ν•˜λ €λ©΄ mpld3 λ ˆμ΄μ•„μ›ƒμ„ λ‹€μ‹œ μž‘μ—…ν•΄μ•Ό ν•©λ‹ˆλ‹€. matplotlib μžμ²΄κ°€ 이것을 μ–΄λ–»κ²Œ μ²˜λ¦¬ν•˜λŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€.

μ •ν™•νžˆ.

axis._frameon은 λ°°κ²½ νŒ¨μΉ˜μ™€ 패치 μ£Όλ³€μ˜ ν”„λ ˆμž„ λͺ¨λ‘μ˜ λ“œλ‘œμž‰μ„ μ œμ–΄ν•˜λŠ” ​​데 μ‚¬μš©λ˜λŠ” κ²ƒμœΌλ‘œ λ³΄μž…λ‹ˆλ‹€. Frameon은 첫 번째 좕에 λŒ€ν•΄ true이고 두 번째 좕에 λŒ€ν•΄ falseμž…λ‹ˆλ‹€. 이제 frameon을 True둜 μ„€μ •ν•˜λ©΄ 첫 번째 좕에 μ†ν•˜λŠ” 선이 더 이상 ν‘œμ‹œλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax1 = fig.add_subplot(1,1,1)

t = np.arange(0.01, 10.0, 0.01)
s1 = np.exp(t)
ax1.plot(t, s1, 'b-')
ax1.set_xlabel('time (s)')
# Make the y-axis label and tick labels match the line color.
ax1.set_ylabel('exp', color='b')
for tl in ax1.get_yticklabels():
    tl.set_color('b')

ax2 = ax1.twinx()
s2 = np.sin(2*np.pi*t)
sin = ax2.plot(t, s2, 'r.')
ax2.set_ylabel('sin', color='r')
for tl in ax2.get_yticklabels():
    tl.set_color('r')

print ax1.get_frame_on()
print ax2.get_frame_on()

ax2.set_frame_on(True)

plt.show()

이것은 이 λ¬Έμ œκ°€ #186κ³Ό 관련이 있으며 ν•˜λ‚˜λ₯Ό ν•΄κ²°ν•˜λŠ” 것이 λ‹€λ₯Έ 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 데도 도움이 λ˜μ–΄μ•Ό 함을 μ‹œμ‚¬ν•©λ‹ˆλ‹€.

μ•„- λŒ€λ‹¨ν•΄! 쑰사해 μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€.

이 문제λ₯Ό μ–΄λ–»κ²Œ ν•΄κ²°ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ? κ°€μž₯ ν™•μ‹€ν•œ 해결책은 frame_on을 ν•¨κ»˜ μ „λ‹¬ν•˜κ³  frame_on이 True인지 False인지λ₯Ό κ³ λ €ν•˜μ—¬ mpld3_Axes의 그리기 방법을 μˆ˜μ •ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

μ½”λ“œλ₯Ό νƒμƒ‰ν•˜λ©΄ Python μΈ‘μ—μ„œ mplexporter 및 MPD3Rendererκ°€ λ³€κ²½λ˜κ³  javascript μΈ‘μ—μ„œ mpld3Axesκ°€ λ³€κ²½λ©λ‹ˆλ‹€.

예: mplexporterλŠ” frame_on λ₯Ό ν†΅κ³Όν•˜λ„λ‘ μ—…λ°μ΄νŠΈν•΄μ•Ό ν•˜λ©° False이면 μ—°κ²°λœ μ„ κ³Ό μ±„μš°κΈ° 색상이 투λͺ…ν•΄μ•Ό ν•©λ‹ˆλ‹€.

두 번째 μΆ•μ˜ 배경에 μ•ŒνŒŒλ₯Ό μ„€μ •ν•˜μ—¬ 문제λ₯Ό ν”Όν–ˆμŠ΅λ‹ˆλ‹€.

ax2.patch.set_alpha(0.0)
ax2.patch.set_alpha(0.0)

선을 ν‘œμ‹œν•  수 μžˆμ§€λ§Œ ν˜Έλ²„, 팬 및 ν™•λŒ€/μΆ•μ†Œ λ„κ΅¬λŠ” μ—¬μ „νžˆ μ•„λž˜μͺ½ μΆ•μ—μ„œ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 도ꡬ가 λͺ¨λ“  μΆ•μ—μ„œ μž‘λ™ν•˜λ„λ‘ ν•˜λŠ” 방법이 μžˆμŠ΅λ‹ˆκΉŒ?

λ‚΄κ°€ 많이 틀리지 μ•ŠλŠ” ν•œ 이것은 μ—¬μ „νžˆ β€‹β€‹λ¬Έμ œμž…λ‹ˆλ‹€. ax2.patch.set_alpha(0.0) μ‚¬μš©ν•˜λ©΄ 두 쌍의 ν”Œλ‘―μ„ λͺ¨λ‘ λ³Ό 수 μžˆμ§€λ§Œ ν™•λŒ€/μΆ•μ†Œ/이동은 μ—¬μ „νžˆ ​​상단 μΆ•μ—μ„œλ§Œ μž‘λ™ν•©λ‹ˆλ‹€. 두 κ·Έλž˜ν”½ λͺ¨λ‘ λ³€κ²½λ˜μ§€λ§Œ xμΆ•κ³Ό 보쑰 yμΆ•λ§Œ μƒˆ 크기 쑰정에 μ‘λ‹΅ν•©λ‹ˆλ‹€.

λ‚΄κ°€ 찾은 또 λ‹€λ₯Έ λ¬Έμ œλŠ” μ„Έ 개의 x좕을 μ‚¬μš©ν•˜λ €κ³  ν•˜λŠ” κ²½μš°μž…λ‹ˆλ‹€. μ„Έ 번째 것은 이 예 μ—μ„œ μ„€λͺ…ν•œ λŒ€λ‘œ 였λ₯Έμͺ½μ— μžˆμ–΄μ•Ό ν•˜μ§€λ§Œ μ˜ˆμƒλŒ€λ‘œ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ„Έ λ²ˆμ§ΈλŠ” 두 λ²ˆμ§Έλ³΄λ‹€ μš°μ„ ν•©λ‹ˆλ‹€. ν™•λŒ€/μΆ•μ†Œ λ„κ΅¬λŠ” μ—¬μ „νžˆ twinx() λ©”μ„œλ“œμ—μ„œ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 빨리 κ³ μΉ  수 있기λ₯Ό λ°”λžλ‹ˆλ‹€(μ—¬κ°€ μ‹œκ°„μ΄ 있으면 μ‹œλ„ν•˜κ² μŠ΅λ‹ˆλ‹€).

captura de tela de 2017-09-10 01-21-32

@fronchetti 이 ν”„λ‘œμ νŠΈλŠ” 더 이상 μœ μ§€λ˜μ§€ μ•ŠμœΌλ©° λͺ‡ λ…„ λ™μ•ˆ μœ μ§€λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. READMEμ—μ„œ:

μ°Έκ³ : mpld3은 더 이상 적극적으둜 μœ μ§€ κ΄€λ¦¬λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. κΈ°λŠ₯ μš”μ²­ 및 버그 λ³΄κ³ μ„œμ— λŒ€ν•œ 닡변이 없을 수 μžˆμŠ΅λ‹ˆλ‹€. 이 ν”„λ‘œμ νŠΈλ₯Ό μœ μ§€ κ΄€λ¦¬ν•˜λŠ” 데 관심이 있으면 μ €μž₯μ†Œ μ†Œμœ μžμ—κ²Œ λ¬Έμ˜ν•˜μ‹­μ‹œμ˜€.

Python을 μœ„ν•œ λ‹€λ₯Έ λ§Žμ€ μ›Ή/λ…ΈνŠΈλΆ ν”Œλ‘œνŒ… μ˜΅μ…˜μ΄ μžˆμŠ΅λ‹ˆλ‹€: λͺ‡ κ°€μ§€λ§Œ 예λ₯Ό λ“€λ©΄ μ•Œν…Œμ–΄, 보케, bqplot. [곡개: μ €λŠ” Bokeh 핡심 κ°œλ°œμžμž…λ‹ˆλ‹€.] λ˜λŠ” 이 ν”„λ‘œμ νŠΈμ˜ μ†Œμœ κΆŒμ„ μ–»λŠ” 데 관심이 μžˆλ‹€λ©΄ Jakeμ—κ²Œ 이메일을 λ³΄λ‚΄λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

μ•„μ•Ό! λ‚˜λŠ” κ·Έλ“€μ˜ μ›Ήμ‚¬μ΄νŠΈμ—μ„œ 이 정보λ₯Ό 보지 λͺ»ν–ˆλ‹€. λ‚˜λŠ” λ‚΄ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλŠ” 문제λ₯Ό μ°Ύμ•„ 여기에 μ™”μŠ΅λ‹ˆλ‹€. @bryevdv κ°μ‚¬ν•©λ‹ˆλ‹€. λ‹€λ₯Έ ν”Œλ‘œνŒ… μ˜΅μ…˜μ„ μ‹œλ„ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰