Mpld3: ENH: twinx / twiny لا تعمل.

تم إنشاؤها على ٧ مايو ٢٠١٤  ·  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 . لست متأكدًا من أفضل طريقة لاكتشاف ذلك في كائن المحاور. ربما تكون الخطوة الأولى في معرفة كيفية تنفيذ ذلك هي معرفة كيفية رفع تحذير عند وجوده!

ينتج عن 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 ، والذي يرسم ببساطة المحورين فوق بعضهما البعض. لقد تحققت من هذا باستخدام مكون إضافي بسيط وهذا هو الحال بالفعل. كلا الخطين الأسي Line2D و sin Line2D موجودان في الجانب D3. في الواقع ، يحتوي الشكل الموجود على الجانب D3 على محورين. وهذا يفسر أيضًا سبب تقديم القراد بشكل صحيح. لا يوجد شيء من المحاور الثانية المرسومة عليهم.

حسنًا ، تم رسم كلا المحورين ، لكن أحدهما فوق الآخر. نظرًا لوجود خلفية بيضاء غير شفافة ، يتم إخفاء محتوى المحاور السفلية. أيضًا ، نظرًا لأن أحداث الماوس لا تنتشر عبر عناصر المحاور ، فإن المحاور العليا فقط هي التي تستجيب للتكبير.

سيتطلب إصلاح هذا بعض إعادة عمل تخطيط mpld3. أتساءل كيف يتعامل matplotlib نفسه مع هذا؟

بالضبط.

يبدو أن المحاور ._frameon تُستخدم للتحكم في رسم رقعة الخلفية وكذلك الإطار حول التصحيح. يكون Frameon صحيحًا بالنسبة إلى المحاور الأولى وخطأ بالنسبة إلى المحاور الثانية. إذا قمنا الآن بتعيين 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 على طول وتعديل طريقة السحب لـ mpld3_Axes لمراعاة ما إذا كان frame_on صحيحًا أم خطأ.

من خلال تصفح الكود ، قد يستلزم ذلك تغييرات في mplexporter و MPD3Renderer ، على جانب python ، وتغييرًا إلى mpld3Axes على جانب جافا سكريبت.

نعم: يجب تحديث mplexporter للمرور عبر frame_on ، وإذا كان خطأ ، فيجب أن تكون الخطوط المقترنة ولون التعبئة شفافة.

لقد تجنبت المشكلة عن طريق تعيين ألفا على خلفية المحور الثاني.

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

يسمح للخطوط بالظهور ، لكن أدوات التمرير والتحريك والتكبير / التصغير لا تزال لا تعمل على المحاور السفلية. هل هناك طريقة للسماح للأدوات بالعمل على جميع المحاور؟

ما لم أكن مخطئًا كثيرًا ، لا تزال هذه مشكلة. باستخدام ax2.patch.set_alpha(0.0) يمكنني رؤية قطعتي التوأم ، لكن التكبير / التحريك لا يزال يعمل فقط مع المحاور العليا. يتغير كلا الرسمين ، فقط المحور السيني والمحور الصادي الثانوي يستجيبان للقياس الجديد.

مشكلة أخرى وجدتها هي إذا حاولت استخدام ثلاثة محاور x. يجب أن يكون الثالث على اليمين كما هو موضح في هذا المثال ، لكنه لا يعمل كما يفترض أن يكون. الثالث يتجاوز الثاني. لا تزال أداة التكبير / التصغير لا تعمل مع طريقة twinx () بالنسبة لي. آمل أن تتمكن من إصلاحه قريبًا (إذا كان لدي وقت فراغ ، فسأحاول ذلك).

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

fronchetti لم يعد هذا المشروع قيد الصيانة ، ولم يكن كذلك لبضع سنوات. من README:

ملاحظة: mpld3 لم يعد يتم صيانته بشكل نشط: طلبات الميزات وتقارير الأخطاء من المحتمل ألا يتم الرد عليها. إذا كنت مهتمًا بصيانة هذا المشروع ، فيرجى الاتصال بأحد مالكي المستودعات.

هناك الكثير من خيارات التخطيط الأخرى للويب / الكمبيوتر الدفتري لبايثون: altair ، bokeh ، bqplot ، على سبيل المثال لا الحصر. [الإفصاح: أنا مطور Bokeh الأساسي] أو إذا كنت مهتمًا بالحصول على ملكية هذا المشروع ، أقترح إرسال بريد إلكتروني إلى Jake.

أوتش! لم أر هذه المعلومات في موقعهم على الإنترنت. لقد جئت للتو إلى هنا للبحث عن المشكلات التي يمكن أن تحل مشكلتي. شكرًا لك bryevdv ، سأحاول خيارًا آخر للتخطيط.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات