Mpld3: ENH: twinx/twiny tidak berfungsi.

Dibuat pada 7 Mei 2014  ·  17Komentar  ·  Sumber: mpld3/mpld3

twinx/twiny tidak berfungsi seperti yang diharapkan. Saya tahu ini ada di daftar TODO, tetapi belum ada masalah terbuka untuk ini.

Tampaknya hanya dataset terakhir yang diplot. Berikut adalah contoh resmi.

mpld3 kembali:
image

tk-agg kembali:
image

Kode untuk direproduksi

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()

Komentar yang paling membantu

Saya menghindari masalah dengan menyetel alfa pada latar belakang sumbu kedua.

ax2.patch.set_alpha(0.0)

Semua 17 komentar

PS di bawah Fitur poin terakhir "alat interaktivitas tambahan, seperti menyikat dan memperbesar kotak" mungkin dapat dihapus, karena kotak-zoom dan brusing keduanya diimplementasikan.

Terima kasih - Saya membayangkan ini akan menjadi masalah terbuka untuk waktu yang cukup lama... memperbaikinya akan melibatkan beberapa perubahan yang sangat mendasar pada paket.

Karena penasaran: apakah masalahnya ada di d3.js, mplexporter atau mpld3?

Mungkinkah peringatan ditambahkan? (Twinx x belum diimplementasikan)

Hmm, atau lebih baik lagi, karena kutu bingkai di sebelah kanan diambil, mungkin saya bisa memalsukan ini dengan menggambar garis biru berskala pada yang pertama (sumbu kiri). Akan dicoba besok...

Peringatan akan menjadi ide yang bagus. Itu harus terjadi di mplexporter/exporter.py . Saya tidak yakin cara terbaik untuk mendeteksi ini di objek Axes. Mungkin langkah pertama dalam mencari tahu bagaimana menerapkan ini adalah mencari tahu bagaimana memunculkan peringatan ketika itu ada!

twinx() dan twiny() menghasilkan pembuatan sumbu tambahan yang memiliki lokasi yang sama dengan sumbu asli. Mendeteksi apakah dua sumbu kembar tidak terlalu sulit:

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()

Mengingat bahwa kedua sumbu hanya ditumpuk, saya berasumsi bahwa semuanya diteruskan ke D3, yang hanya menarik kedua sumbu di atas satu sama lain. Saya memeriksa ini dengan plugin sederhana dan memang demikian. Baik Line2D eksponensial dan sin Line2D ada di sisi D3. Faktanya, gambar di sisi D3 memiliki dua sumbu. Ini juga menjelaskan mengapa kutu ditampilkan dengan benar. Tidak ada apa pun dari sumbu kedua yang ditarik di atasnya.

Oke, jadi kedua sumbu digambar, tapi yang satu di atas yang lain. Karena memiliki latar belakang putih buram, konten sumbu bawah disembunyikan. Juga, karena peristiwa mouse tidak menyebar melalui elemen sumbu, hanya sumbu atas yang merespons pembesaran.

Memperbaiki ini akan memerlukan beberapa pengerjaan ulang tata letak mpld3. Saya bertanya-tanya bagaimana matplotlib sendiri menangani ini?

Tepat.

Tampaknya axes._frameon digunakan untuk mengontrol gambar patch latar belakang serta bingkai di sekitar patch. Frameon benar untuk sumbu pertama dan salah untuk sumbu kedua. Jika kita sekarang menetapkan frameon ke True, kita tidak lagi melihat garis yang termasuk dalam sumbu pertama:

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()

Ini menunjukkan bahwa masalah ini terkait dengan #186 dan bahwa menangani yang satu juga harus membantu dalam menangani yang lain.

Ah - itu bagus! Terima kasih telah menggalinya.

Bagaimana Anda ingin mengatasi masalah ini? Solusi yang paling jelas adalah meneruskan frame_on dan memodifikasi metode draw dari mpld3_Axes untuk memperhitungkan apakah frame_on Benar atau Salah.

Dari menelusuri kode, ini akan memerlukan perubahan pada mplexporter dan MPD3Renderer, di sisi python, dan perubahan ke mpld3Axes di sisi javascript.

Yap: mplexporter harus diperbarui untuk melewati frame_on , dan jika False, garis terkait dan warna isian harus transparan.

Saya menghindari masalah dengan menyetel alfa pada latar belakang sumbu kedua.

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

memungkinkan garis muncul, tetapi alat hover, pan, dan zoom masih tidak berfungsi pada sumbu bawah. Apakah ada cara untuk memungkinkan alat bekerja pada semua sumbu?

Kecuali saya banyak salah ini masih menjadi masalah. Menggunakan ax2.patch.set_alpha(0.0) Saya dapat melihat kedua plot kembar saya, tetapi zoom/pan masih hanya berfungsi untuk sumbu atas. Kedua grafik berubah, tetapi hanya sumbu x dan sumbu y sekunder yang merespons penskalaan baru.

Masalah lain yang saya temukan adalah jika Anda mencoba menggunakan tiga sumbu x. Yang ketiga harus di kanan seperti yang dijelaskan dalam contoh ini , tetapi tidak berfungsi sebagaimana mestinya. Yang ketiga mengesampingkan yang kedua. Alat zoom masih tidak berfungsi dengan metode twinx() untuk saya. Semoga bisa segera diperbaiki (Jika saya punya waktu luang, saya akan coba).

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

@fronchetti proyek ini tidak lagi dipertahankan, dan sudah tidak ada selama beberapa tahun. Dari README:

Catatan: mpld3 tidak lagi dipertahankan secara aktif: permintaan fitur & laporan bug kemungkinan besar tidak akan dijawab. Jika Anda tertarik untuk memelihara proyek ini, silakan hubungi salah satu pemilik repositori.

Ada banyak opsi plot web/notebook lain untuk Python: altair, bokeh, bqplot, hanya untuk beberapa nama. [pengungkapan: Saya adalah pengembang inti Bokeh] Atau jika Anda tertarik untuk mengambil alih kepemilikan proyek ini, saya sarankan mengirim email ke Jake.

Aduh! Saya tidak melihat informasi ini di situs web mereka. Saya hanya datang ke sini mencari masalah yang bisa menyelesaikan masalah saya. Terima kasih @bryevdv , saya akan mencoba opsi plot lain.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat