xticks
μΈμλ₯Ό μ¬μ©ν λ ν¬λ νλ‘―μ λ§μ§μ거리λ€κ° μ΄ μ€λ₯κ° λ°μνμ΅λλ€.
κ°λ
μ¦λͺ
μ λ€μκ³Ό κ°μ΅λλ€.
http://nbviewer.ipython.org/gist/edvakf/a47a41ace10afbd891ff
(http://pandas.pydata.org/pandas-docs/stable/visualization.html μμ )
μ - mplexporter
μ΄ xticksκ° λͺ©λ‘μ΄λΌκ³ μλͺ» κ°μ ν κ² κ°μ΅λλ€. λ²κ·Έμ
λλ€.
κ·Έλμ xticksλ₯Ό λͺ©λ‘μΌλ‘ μλμΌλ‘ λ³ννλ©΄ μλν©λλ€.
μ¬μ€μ κ·Έλ μ§ μμ΅λλ€. μ¦, λ€μμ μ μλν©λλ€.
fig = plt.figure()
ax = fig.add_subplot(111, xticks=np.arange(11))
ax.plot([0, 10], [0, 10], '-k')
mpld3.show()
Pandasλ μ¬κΈ°μμ ν±μΌλ‘ μ΄μν μΌμ νκ³ μμ΅λλ€. 2000
κ° μ§λ ¬νν μ μλ€λ μ€λ₯κ° νμλ©λλ€. μ΄λ λ―ΈμΉ μ§μ
λλ€. Pandasμλ μ§λ ¬νν μ μλ λΆλ μμμ μ νμ΄ λ΄μ₯λμ΄ μμ΅λκΉ?
μ«μ 2000μ΄ μλλΌ μ°λμ
λλ€. datetime
μ§μ₯μ μ€μ κ²μ νμν©λλ€.
(2014λ
6μ 19μΌ νΈμ§: datetime
κ° λ¬Έμ μΈ κ²μ λν΄ μ κ° μλͺ» μκ³ μμλ κ² κ°μ΅λλ€...)
μ΄... μ΄λ»κ² νλκ² μ μΌ μ’μμ§ λͺ¨λ₯΄κ² λ€μ. μ΄κ²¬μλ μ¬λ?
to_json
μμ pandas
to_json
λ₯Ό μ¬μ©νλ κ²μ΄ λμμ΄ λ©λκΉ?
http://pandas.pydata.org/pandas-docs/dev/io.html#date -handling
ν¬λμμ to_jsonμ μ¬μ©νλ κ²μ΄ λμμ΄ λ©λκΉ?
μλ§λ, νμ§λ§ κ·Έλ¬λ©΄ μ½λ λ΄μ λ§μ μΌμ λν΄ try
... except
λ¬Έμ μνν΄μΌ ν κ²μ
λλ€(μ¦, κ°μ΄ Pandas λ³μμΈ κ²½μ° λ€μμ μνν©λλ€. κ·Έλ μ§ μμΌλ©΄ λ€λ₯Έ λ°©λ²μΌλ‘) κ·Έλ° λ€μ μλ°μ€ν¬λ¦½νΈ μΈ‘μ μΆ λ μ΄λΈμ΄ Pandasκ° μΆλ ₯νκΈ°λ‘ κ²°μ ν λͺ¨λ JSON ꡬ쑰λ₯Ό μ²λ¦¬ν μ μλμ§ νμΈνμμμ€. λλ λ§€μ° μ·¨μ½ν μ루μ
κ³Ό μ μ§ κ΄λ¦¬ μ
λͺ½μ²λΌ λ€λ¦¬κΈ° λλ¬Έμ κ·Έλ¬ν μμ€μ 볡μ‘μ±μ μΆκ°νμ§ μλ κ²μ μ νΈν©λλ€.
λ΄κ° μ°Έμ‘°. μ΄κ²μ Pythonμ΄ μ¬μ©μ μ μ ν΄λμ€μ λν json μ§λ ¬ν λ°©λ²μ λ ΈμΆν μ μλ€λ μ μΌλ‘ μμ½λ©λλ€. μ΄ λ¬Έμ λ₯Ό λ«μ μ μμ΅λλ€.
μ°λ¦¬λ κ·Έκ²μ μ΄μ΄ λμ΄μΌν©λλ€ ... μ΄κ²μ μ²λ¦¬νλ λ μ’μ λ°©λ²μ΄μμ μ μμ΅λλ€. λλ κ·Έκ²μ λν΄ μκ°ν©λλ€.
μ μλ§μ. Python 2.7μμ μ μλνλ κ² κ°μ΅λλ€. Python3μλ§ ν΄λΉλ μ μμ΅λκΉ?
In [56]: matplotlib.__version__
Out[56]: '1.3.1'
In [57]: pandas.__version__
Out[57]: '0.13.1'
μ¬λ¬λΆ μλ
νμΈμ,
κ΄λ ¨μ΄ μλμ§ νμ€νμ§ μμ§λ§ μ΄ seaborn κ·Έλνλ₯Ό 그릴 λ λΉμ·ν λ¬Έμ κ° λ°μν©λλ€. http://www.stanford.edu/~mwaskom/software/seaborn/examples/many_facets.html
mpld3.fig_to_html(grid.fig, 'test.html')
/home/vagrant/graph/local/lib/python2.7/site-packages/mpld3/mplexporter/exporter.py:82: UserWarni ng: Blended transforms not yet supported. Zoom behavior may not work as expected.
warnings.warn("Blended transforms not yet supported. "
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/vagrant/graph/local/lib/python2.7/site-packages/mpld3/_display.py", line 236, in fig_to_html
figure_json=json.dumps(figure_json),
File "/usr/lib/python2.7/json/__init__.py", line 231, in dumps
return _default_encoder.encode(obj)
File "/usr/lib/python2.7/json/encoder.py", line 201, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/lib/python2.7/json/encoder.py", line 264, in iterencode
return _iterencode(o, 0)
File "/usr/lib/python2.7/json/encoder.py", line 178, in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: 0 is not JSON serializable
λ¬Έμ λ numpy.int64 μ«μκ° λ΄λΆμ μΌλ‘ μ¬μ©λλ©° κΈ°λ³Έμ μΌλ‘ jsonμ μ§λ ¬νν μ μλ€λ κ²μ
λλ€.
μ΄λ₯Ό μ²λ¦¬νκΈ° μν΄ json.JSONEncoderλ₯Ό μ 곡νκΈ° μν΄ λΌμ΄λΈλ¬λ¦¬μ νν¬κ° μμ΄μΌ ν©λλ€.
μμ΄λμ΄λ₯Ό μν κ³΅κ° μ 곡:
λμΌν λ¬Έμ κ° μμ§λ§ mpld3μ μ¬μ©νλ νλ‘μ νΈμμ μ¬μ© μ€μΈ νλ‘μ νΈμ λ°±μλλ‘ μ¬μ©νλ Djangoμ μ°κ²°λμ΄ μμ΅λλ€.
numpy λ°°μ΄μ μ§λ ¬ννλ €κ³ μλνλλ° django 1.6μ μ¬μ©ν λ μ΄ μ€λ₯κ° λ°μνμ΅λλ€. λλ 1.5λ‘ λ€μ΄ κ·Έλ μ΄λνκ³ μλν©λλ€. κ·Έ μ΄μ λ 1.6 μ΄μλΆν° μ§λ ¬νκ° jsonμΌλ‘ μνλλ λ°λ©΄ 1.5 μ΄νμμλ Pickleμ ν΅ν΄ μνλκΈ° λλ¬Έμ λλ€.
μ΄κ²μ΄ λ¬Έμ κ° λ μ μμμ μ°Ύλ λ° λμμ΄ λκΈ°λ₯Ό λ°λλλ€.
λ©λ 벀리그 νμΌ,
μ λΌλ₯΄λ λ° λΌ λ¦¬λ° μμ€νΌλ
Έμ¬
HΓΈgskolektor
HΓΈgskolen i GjΓΈvik
e-post: μ λΌλ₯΄λ. [email protected]
λͺ¨λΉ: +47 950 13 322
2014λ 6μ 19μΌ 16μ 56λΆμ lvasseur [email protected]μμ λ€μκ³Ό κ°μ΄ μΌμ΅λλ€.
μ¬λ¬λΆ μλ νμΈμ,
κ΄λ ¨μ΄ μλμ§ νμ€νμ§ μμ§λ§ μ΄ seaborn κ·Έλνλ₯Ό 그릴 λ λΉμ·ν λ¬Έμ κ° λ°μν©λλ€. http://www.stanford.edu/~mwaskom/software/seaborn/examples/many_facets.htmlmpld3.fig_to_html(grid.fig, 'test.html')
/home/vagrant/graph/local/lib/python2.7/site-packages/mpld3/mplexporter/exporter.py:82: UserWarni ng: νΌν© λ³νμ μμ§ μ§μλμ§ μμ΅λλ€. νλ/μΆμ λμμ΄ μμλλ‘ μλνμ§ μμ μ μμ΅λλ€.
warnings.warn("νΌν© λ³νμ μμ§ μ§μλμ§ μμ΅λλ€. "
μμΆμ (κ°μ₯ μ΅κ·Ό νΈμΆ λ§μ§λ§):
νμΌ "", 1ν, μμ
νμΌ "/home/vagrant/graph/local/lib/python2.7/site-packages/mpld3/_display.py", 236ν, fig_to_html
figure_json=json.dumps(Figure_json),
νμΌ "/usr/lib/python2.7/json/__init__.py", 231ν, λ€ν
λ°ν _default_encoder.encode(obj)
νμΌ "/usr/lib/python2.7/json/encoder.py", 201ν, μΈμ½λ©
μ²ν¬ = self.iterencode(o, _one_shot=True)
iterencodeμ νμΌ "/usr/lib/python2.7/json/encoder.py", 264ν
λ°ν _iterencode(o, 0)
νμΌ "/usr/lib/python2.7/json/encoder.py", 178ν, κΈ°λ³Έμ μΌλ‘
μμΉ TypeError(repr(o) + "λ JSON μ§λ ¬ν λΆκ°λ₯")
TypeError: 0μ JSONμ μ§λ ¬νν μ μμ΅λλ€.
λ¬Έμ λ numpy.int64 μ«μκ° λ΄λΆμ μΌλ‘ μ¬μ©λλ©° κΈ°λ³Έμ μΌλ‘ jsonμ μ§λ ¬νν μ μλ€λ κ²μ λλ€.
μ΄λ₯Ό μ²λ¦¬νκΈ° μν΄ json.JSONEncoderλ₯Ό μ 곡νκΈ° μν΄ λΌμ΄λΈλ¬λ¦¬μ νν¬κ° μμ΄μΌ ν©λλ€.β
μ΄ μ΄λ©μΌμ μ§μ νμ νκ±°λ GitHubμμ νμΈνμΈμ.
μ°Έκ³ λ‘,
from json import JSONEncoder
class MyEncoder(JSONEncoder):
def default(self, obj):
if isinstance(obj, numpy.int64):
return int(obj)
return JSONEncoder.default(self, obj)
return template.render(figid=json.dumps(figid),
d3_url=d3_url,
mpld3_url=mpld3_url,
figure_json=json.dumps(figure_json, cls=MyEncoder),
extra_css=extra_css,
extra_js=extra_js)
/mpld3/_display.pyμ λ¬Έμ λ₯Ό ν΄κ²°ν©λλ€: fig_to_html
μ§κΈμ μλν μκ°μ΄ μμ§λ§ μ΄κ²μ΄ λ¬Έμ μ΄κ³ μ루μ
μ μ¬λ°λ₯Έ λ°©ν₯μΈ κ² κ°μ΅λλ€. json.dump
λ¬Έμ λ₯Ό 보면 default
μ΅μ
μ΄ μλ μ½κ° λ κ°λ²Όμ΄ μ루μ
μ΄ μλ€κ³ μκ°νμ§λ§ κ²°κ΅μλ ν μ€λ§ λ 짧μ μ μμ΅λλ€. ν 리νμ€νΈλ₯Ό ν μ€λΉκ° λμλμ?
λλ μ΄κ²μ΄ PR #213μ μν΄ μμ λ κ²μ΄λΌκ³ μμνμ§λ§ , μλ κ²μλ¬Όμ ipython λ ΈνΈλΆ μ μ¬μ ν ββλλ₯Ό μν΄ μλνμ§ μμ΅λλ€. λ€λ₯Έ μ¬λλ€μ΄ μλν΄ λ³Ό μ μμ΅λκΉ?
λλ μ΄κ²μ μ΄λ μμ μμ μλ ν κ²μ΄λ€
μ¬μ ν μ΄κ² λλ¬Έμ νΌλμ€λ½μ΅λλ€... #213μ΄ μ€μ λ‘ μ¬κΈ°μμ μμ ν κ²μ΄ μλμ§ νμ€νμ§ μμ΅λλ€. κ·Έκ² μμ΄ int64 κ°μ²΄λ₯Ό μ§λ ¬νν μ μμ΅λλ€ ...
ν΄κ²°λμλμ?
λλ fig_to_html ν¬λ μμ± κ·Έλ¦Όμ λ³Ό μ μμ΅λλ€ ( TypeError: 0 is not JSON serializable
μ»μ΅λλ€). κ·Έλ¦Όμ΄ μ μμ±λ©λλ€.
plt.barλ₯Ό μ¬μ©νμ¬ μ¬μλν λ μ¬μ©μ μ§μ λ¬Έμμ΄κ³Ό ν¨κ» yticksλ₯Ό μ¬μ©νλ κ²½μ°μλ μ€λ₯κ° λ°μν©λλ€.
ν΄κ²° λ°©λ²?
νμ€νμ§ μλ€. μΆ λ μ΄λΈμ΄ μ§λ ¬νν μ μλ μ μ λ²μ μ΄λΌλ λ¬Έμ κ° μλ κ² κ°μ΅λλ€. μμλΈ κ²μ΄ μμΌλ©΄ μλ €μ£Όμμμ€.
μ¬μ©ν λμ΄ μ€λ₯κ° λ°μνλ€λ μ μ μ§μ νκ³ μΆμμ΅λλ€.
dates = df.Date.apply(lambda dt: dt.strftime('%B')[:3] + dt.strftime(' %d')).values
plt.xticks(x, dates, rotation='vertical')
νμ§λ§ ν¨κ»
ax.set_xticklabels(dates, rotation='vertical')
λμμ΄ λμκΈ°λ₯Ό λ°λλλ€.
νΈμ§: μΆκ° κ²μ¬μμ νμ λ²μ μ μ€λ₯λ₯Ό μμ±νμ§ μμ§λ§ κ²°κ³Ό κ·Έλ¦Όμ xticksλ μ€μ λ‘ μ€μ λμ§ μμ΅λλ€.
νΈμ§ 2: λ΄ λμ, λ°©κΈ ν±μ΄ μ§μλμ§ μλλ€λ κ²μ μμμ΅λλ€(#22).
FWIWμμ boxplotsλ₯Ό μ¬μ©νλ©΄ λ¬Έμ λ₯Ό μ¬νν μ μμ΅λλ€.
import numpy as np, mpld3
np.random.seed(937)
data = np.random.lognormal(size=(37, 4), mean=1.5, sigma=1.75)
labels = list('ABCD')
fs = 10 # fontsize
fig, axes = plt.subplots(1, 1, figsize=(6, 6))
axes.boxplot(data, labels=labels)
axes.set_title('Default', fontsize=fs)
html_fig = mppld3.fig_to_html(fig)
νΉν, λ€μμ pip freezeμ λ²μ μ λλ€.
cycler==0.10.0
Jinja2==2.8
MarkupSafe==0.23
matplotlib==1.5.1
mpld3==0.2
numpy==1.10.4
pandas==0.17.1
ptyprocess==0.5.1
pyparsing==2.1.0
python-dateutil==2.5.0
pytz==2015.7
six==1.10.0
wheel==0.29.0
νμ΄μ¬ 3.4.3μ κ²½μ°.
@lvasseurκ° μ μν ν¨μΉκ° λ¬Έμ λ₯Ό ν΄κ²°νλ κ² κ°μ§λ§ _the_ μ루μ μΈμ§λ λͺ¨λ₯΄κ² μ΅λλ€.
μλ μμ κ° μλνλλ‘ νλ €λ©΄ np.arange(2000,2002,1) λμ [float(x) for x in range(2000,2002)]λ₯Ό μ¬μ©νμμμ€.
κ΄λ ¨μ΄ μλμ§ νμ€νμ§ μμ§λ§ μ΄ seaborn κ·Έλνλ₯Ό 그릴 λ λΉμ·ν λ¬Έμ κ° λ°μν©λλ€. http://www.stanford.edu/~mwaskom/software/seaborn/examples/many_facets.html
seaborn barplot κ·Έλ¦Όμ λν΄ mtld3.display(fig)
λ₯Ό μλνλ λμ λμΌν μ€λ₯κ° λ°μν©λλ€.
TypeError: 0μ JSONμ μ§λ ¬νν μ μμ΅λλ€.
λꡬλ mpld3λ‘ seaborn νλ‘―μ λ λλ§ν μ μμ΅λκΉ?
μ΄κ²μ λ°μ΄ν° κ°μ nan
μ΄ μκΈ° λλ¬Έμ λ°μνλ κ² κ°μ΅λλ€. _display.py:243 μμ
figure_json
dictμμ nan
λ₯Ό None
λ‘ λ°κΎΈλ©΄ μμλλ μΆλ ₯μ΄ λμ΅λλ€.
νΈμ§: μμ λ°©λ²μΌλ‘ λ¬Έμ κ° ν΄κ²°λμ§ μλ κ² κ°μ΅λλ€(λλ²κ·Έ μΈν°ν리ν°μμ ν
μ€νΈνμ§λ§ μλνμ§λ§ mpld3μ μ¬μ©ν λλ κ·Έλ μ§ μμ).
λ°λΌμ sns.barplot()
λ λλ§ plt.bar()
μλνμ§ μμ§λ§ plt.bar()
μλν©λλ€. λ νλ‘―μ μμΉμμ λͺ
λ°±ν μ°¨μ΄λ₯Ό λ³Ό μ μμμ§λ§ μ 곡λ ν¨μΉ(https://github.com/mpld3/mpld3/pull/213)λ‘ λ¬Έμ κ° ν΄κ²°λμμ΅λλ€.
λλ λΌμΈμ μΆκ°νμ¬ μ΄κ²μ κ³ μ³€λ€.
elif isinstance(obj, (numpy.ndarray,)):
return obj.tolist()
/mpld3/_display.pyλ‘: NumpyEncoder
@jaklinger κ°μ¬ν©λλ€.
@jaklinger , μλ
νμΈμ. μ μν΄ μ£Όμ
μ κ°μ¬ν©λλ€. μλ²½νκ² μλν©λλ€! ν κ°μ§λ₯Ό λͺ
νν νκ³ μΆμμ΅λλ€. numpy λ°°μ΄μ μ¬μ μΌλ‘ λ³ννκ³ λ°ννλ €κ³ νμ§λ§ μ¬μ μ λ¬Έμ κ° μμμ§λ§ μΈμνκ³ νμΈνμ§λ§ "float 32 is not json serializable" μ€λ₯κ° λ°μνμ΅λλ€. tolist() λ©μλλ₯Ό μ¬μ©νμ¬ λ°°μ΄μ νμ΄μ¬ λͺ©λ‘μΌλ‘ λ³ννμ΅λλ€.
μ΄μ :[100. 0. 0. 0. 0.]
with tolist: [100.0, 0.0, 0.0, 0.0, 0.0] μλ²½νκ² λ°νλμμ΅λλ€.
κ·Έλ λ€λ©΄ λ¬Έμ κ° μ νν 무μμ΄μμ΅λκΉ? 미리 κ°μ¬λ립λλ€.
@padmaksha18 λ¬΄μ¨ λ§μΈμ§ 100% νμ ν μ μμ΅λλ€.
numpy λ°°μ΄μ μ¬μ μΌλ‘ λ³ν
νμ§λ§ (κ°λ¨ν) numpy
λ° python
μ νμ λμΌνμ§ μμ΅λλ€( float32
λ float
μ λμΌνμ§ μμ΅λλ€. array
λ list
λ±κ³Ό κ°μ§ μμΌλ©° JSONEncoder ν΄λμ€ λ κΈ°λ³Έ python
μ νλ§ 'νμ©'ν©λλ€. λ°λΌμ... μ΄ ν¨μ (μ μμ μ¬ν ν¬ν¨)μ μμ μ μ
λ ₯ obj
λ₯Ό κΈ°λ³Έ python
ν΄λΉνλ νλͺ©μΌλ‘ λ³ννλ κ²μ
λλ€.
@jaklinger :μλ Joel, λ€μ ν λ² κ°μ¬λ립λλ€. μ¬μ μΌλ‘ λ³ννλ€λ κ²μ μ΄λ¬ν λ°°μ΄ λ κ°λ₯Ό κ°μ Έμμ ν€ κ° μμ νμ±νλ€λ μλ―Έμ λλ€. λͺ ννκ² μ€λͺ νμ§ λͺ»ν΄ μ£μ‘ν©λλ€. μ΄ μ μ λΆλͺ ν ν΄ μ£Όμ μ κ°μ¬ν©λλ€. λ¨Όμ λ€μ΄ν°λΈ νμ΄μ¬ μ νμΌλ‘ λ³νν΄μΌ νκ³ κ·Έκ²μ΄ λ¬Έμ μμ΅λλ€. μ¬μ μ jsonifyνμ§ μκ³ μλ κ·Έλλ‘ λ°ννλ €κ³ νλ©΄ jsonencoder ν΄λμ€κ° κ·Έλ¦Όμ λνλ κΉμ? κ°μ¬ν©λλ€!
pip μ€μΉ "git+ https://github.com/javadba/mpld3@display_fix "
κ°μ₯ μ μ©ν λκΈ
λλ λΌμΈμ μΆκ°νμ¬ μ΄κ²μ κ³ μ³€λ€.
/mpld3/_display.pyλ‘: NumpyEncoder