मैंने हाल ही में एक नई परियोजना शुरू की है जिसके लिए मुझे मानचित्र पर अक्षांश और लंबे डेटा को प्लॉट करने की आवश्यकता है। मैं अब तक सब कुछ प्लॉट करने में कामयाब रहा हूं, लेकिन मैं रेंज स्लाइडर के लिए कॉलबैक फ़ंक्शन बनाने में फंस गया हूं जिसका उपयोग मैं नियंत्रित करने के लिए कर रहा हूं कि कौन सा डेटा प्लॉट करना है।

मेरा वर्तमान कोड इस प्रतिक्रिया का उपयोग करता है यहां Amstrad2Python द्वारा इसके आधार के रूप में। Amstrad2Python द्वारा प्रदान किए गए कोड को चलाने से मुझे कोई त्रुटि नहीं मिली। हालांकि, जब मैं कोड चलाने की कोशिश करता हूं, तो जब मैं एचटीएमएल प्लॉट में कंसोल आउटपुट की जांच करता हूं तो यह मुझे "अपरिभाषित की संपत्ति 'एमिट' नहीं पढ़ सकता" त्रुटि देता है।

यहां नमूना कोड है जो मेरे द्वारा उपयोग किए जा रहे वास्तविक कोड के समान है, जो ठीक वही त्रुटि बनाता है:

import bokeh.events as bev
import bokeh.layouts as bla
import bokeh.models as bmo
import numpy as np
import pandas as pd
from bokeh.plotting import figure, output_file, show

sample_data = pd.DataFrame(
    data=np.array(
        [
            [1, 12, 21, 15000],
            [2, 25, 90, 15500],
            [3, 37, 47, 15500],
            [4, 41, 56, 15000],
            [5, 50, 21, 14500]
        ]
    ),
    columns=['Seconds', 'lat', 'long', 'alt']
)

#create 2 sources, 1 for editting, 1 for referencing
source = bmo.ColumnDataSource(sample_data)    #const data
filtered_source = bmo.ColumnDataSource(sample_data)   #alterable data

#create callback function
callback = bmo.CustomJS(args=dict(source=source, filtered_source = filtered_source), 
   code=""" 
    var data = source.data;
    var start = cb_obj.value[0];
    var end = cb_obj.value[1];
    
    function generateNewDataObject(oldDataObject){
        var newDataObject = {}
        for (var key of Object.keys(oldDataObject)){
                newDataObject[key] = [];
                }
        return newDataObject
    }

    function addRowToAccumulator(accumulator, dataObject, index) {
        for (var key of Object.keys(dataObject)){
                accumulator[key][index] = dataObject[key][index];
                }
        return accumulator;
    }
    
    
    var new_data =  generateNewDataObject(data);
    for  (var i = 0; i < source.data['Seconds'].length; i++){
        if (source.data['Seconds'][i] > start) {
            if (source.data['Seconds'][i] <= end) {
                 new_data = addRowToAccumulator(new_data, source.data, i);
            }
        }
    }
    console.log(new_data)
    filtered_source = new_data; 
    filtered_source.change.emit();
""")

#create slider and add on_change event
testSlider = bmo.RangeSlider(width = 525, bar_color = 'red', 
                                start = 0, end = sample_data['Seconds'].max(),
                                value=(0,1), step = 1 )
testSlider.js_on_change('value', callback)

#create figure and plot points
p = figure(toolbar_location = 'below',
           x_axis_label = 'Longitude', y_axis_label = 'Latitude')

p.circle(x = 'long', y = 'lat', source=filtered_source)

#create layout and show
layout = bla.column(p, testSlider)
show(layout)

संदर्भ के लिए, यह परिणामी त्रुटि है जो मुझे तब मिलती है जब मैं स्लाइडर को बदलने का प्रयास करता हूं:
https://i.stack.imgur.com/OTBEm.png

क्या किसी को पता है कि मेरे वर्तमान कोड के साथ समस्या क्या है? मेरे कोड के संबंध में किसी भी प्रतिक्रिया की भी सराहना की जाती है। पहले ही, आपका बहुत धन्यवाद।

0
Oboros 23 मार्च 2021, 11:11

1 उत्तर

सबसे बढ़िया उत्तर

आपको new_data को filtered_source के .data फ़ील्ड में असाइन करना होगा।
लाइन filtered_source = new_data; को filtered_source.data = new_data; में बदलते समय, आपका उदाहरण मेरे लिए काम करता है।

0
Crysers 23 मार्च 2021, 15:16
आह, ऐसा लगता है कि मैंने कोड के उस हिस्से को अनदेखा कर दिया है... प्रतिक्रिया के लिए धन्यवाद
 – 
Oboros
23 मार्च 2021, 17:47