twinx/twinyκ° μμλλ‘ μλνμ§ μμ΅λλ€. μ΄κ²μ΄ TODO λͺ©λ‘μ μλ€λ κ²μ μκ³ μμ§λ§ μμ§ μ΄μ λν λ―Έν΄κ²° λ¬Έμ κ° μμ΅λλ€.
λ§μ§λ§ λ°μ΄ν° μΈνΈλ§ κ·Έλ €μ§ κ² κ°μ΅λλ€. λ€μ μ 곡μ μμ λλ€.
mpld3λ λ€μμ λ°νν©λλ€.
tk-aggλ λ€μμ λ°νν©λλ€.
μ¬νν μ½λ
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()
κΈ°λ₯ μλμ 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() λ©μλμμ μλνμ§ μμ΅λλ€. 빨리 κ³ μΉ μ μκΈ°λ₯Ό λ°λλλ€(μ¬κ° μκ°μ΄ μμΌλ©΄ μλνκ² μ΅λλ€).
@fronchetti μ΄ νλ‘μ νΈλ λ μ΄μ μ μ§λμ§ μμΌλ©° λͺ λ λμ μ μ§λμ§ μμμ΅λλ€. READMEμμ:
μ°Έκ³ : mpld3μ λ μ΄μ μ κ·Ήμ μΌλ‘ μ μ§ κ΄λ¦¬λμ§ μμ΅λλ€. κΈ°λ₯ μμ² λ° λ²κ·Έ λ³΄κ³ μμ λν λ΅λ³μ΄ μμ μ μμ΅λλ€. μ΄ νλ‘μ νΈλ₯Ό μ μ§ κ΄λ¦¬νλ λ° κ΄μ¬μ΄ μμΌλ©΄ μ μ₯μ μμ μμκ² λ¬Έμνμμμ€.
Pythonμ μν λ€λ₯Έ λ§μ μΉ/λ ΈνΈλΆ νλ‘ν μ΅μ μ΄ μμ΅λλ€: λͺ κ°μ§λ§ μλ₯Ό λ€λ©΄ μν μ΄, 보μΌ, bqplot. [곡κ°: μ λ Bokeh ν΅μ¬ κ°λ°μμ λλ€.] λλ μ΄ νλ‘μ νΈμ μμ κΆμ μ»λ λ° κ΄μ¬μ΄ μλ€λ©΄ Jakeμκ² μ΄λ©μΌμ 보λ΄λ κ²μ΄ μ’μ΅λλ€.
μμΌ! λλ κ·Έλ€μ μΉμ¬μ΄νΈμμ μ΄ μ 보λ₯Ό λ³΄μ§ λͺ»νλ€. λλ λ΄ λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ λ¬Έμ λ₯Ό μ°Ύμ μ¬κΈ°μ μμ΅λλ€. @bryevdv κ°μ¬ν©λλ€. λ€λ₯Έ νλ‘ν μ΅μ μ μλν΄ λ³΄κ² μ΅λλ€.
κ°μ₯ μ μ©ν λκΈ
λ λ²μ§Έ μΆμ λ°°κ²½μ μνλ₯Ό μ€μ νμ¬ λ¬Έμ λ₯Ό νΌνμ΅λλ€.