Using for loop generator to make Bokeh scatter plot with categorical values












0















I would like to use a loop as a generator to create individual glyphs to generate a scatter plot. My x values are categorical values. I'm starting from the following simple example.



from bokeh.plotting import figure, show

xvals = ['one', 'two', 'three']
p = figure(x_range=xvals)

i=1
for value in xvals:
p.circle(x=value,y=i)
i+=1

show(p)


This results in Bokeh throwing the error:




Bokeh Error attempted to retrieve property array for nonexistent field
'one'




I'm guessing this can be sorted by using columndatasource and passing it as the source to the glyph rendering function. I've tried various ways to structure the data and pass it to the renderer, but without luck. The columndatasource object wants to be passed a dictionary with the format:



data = {'x_values': [1, 2, 3, 4, 5],
'y_values': [6, 7, 2, 3, 6]}


I am not able to call a complete list of y values before the generator as they will be computed during the loop in my real function. Is there any way around this? This is super easy to do with pyplot, but I need to use Bokeh for its interactive plots.



Thanks!










share|improve this question























  • I'm guessing from the crickets that this is not possible. Can bokeh handle scatter plots with multiple y values for each x value? With categorical data?

    – JeremyD
    Jan 8 at 13:33











  • For anyone who is trying to accomplish similar, I was not able to get this approach to work. I instead wrote a generator function to create a pandas dataframe which I then fed back to the glyph renderer using the ColumnDataSource object. I will post a minimal example below.

    – JeremyD
    Jan 9 at 13:51
















0















I would like to use a loop as a generator to create individual glyphs to generate a scatter plot. My x values are categorical values. I'm starting from the following simple example.



from bokeh.plotting import figure, show

xvals = ['one', 'two', 'three']
p = figure(x_range=xvals)

i=1
for value in xvals:
p.circle(x=value,y=i)
i+=1

show(p)


This results in Bokeh throwing the error:




Bokeh Error attempted to retrieve property array for nonexistent field
'one'




I'm guessing this can be sorted by using columndatasource and passing it as the source to the glyph rendering function. I've tried various ways to structure the data and pass it to the renderer, but without luck. The columndatasource object wants to be passed a dictionary with the format:



data = {'x_values': [1, 2, 3, 4, 5],
'y_values': [6, 7, 2, 3, 6]}


I am not able to call a complete list of y values before the generator as they will be computed during the loop in my real function. Is there any way around this? This is super easy to do with pyplot, but I need to use Bokeh for its interactive plots.



Thanks!










share|improve this question























  • I'm guessing from the crickets that this is not possible. Can bokeh handle scatter plots with multiple y values for each x value? With categorical data?

    – JeremyD
    Jan 8 at 13:33











  • For anyone who is trying to accomplish similar, I was not able to get this approach to work. I instead wrote a generator function to create a pandas dataframe which I then fed back to the glyph renderer using the ColumnDataSource object. I will post a minimal example below.

    – JeremyD
    Jan 9 at 13:51














0












0








0








I would like to use a loop as a generator to create individual glyphs to generate a scatter plot. My x values are categorical values. I'm starting from the following simple example.



from bokeh.plotting import figure, show

xvals = ['one', 'two', 'three']
p = figure(x_range=xvals)

i=1
for value in xvals:
p.circle(x=value,y=i)
i+=1

show(p)


This results in Bokeh throwing the error:




Bokeh Error attempted to retrieve property array for nonexistent field
'one'




I'm guessing this can be sorted by using columndatasource and passing it as the source to the glyph rendering function. I've tried various ways to structure the data and pass it to the renderer, but without luck. The columndatasource object wants to be passed a dictionary with the format:



data = {'x_values': [1, 2, 3, 4, 5],
'y_values': [6, 7, 2, 3, 6]}


I am not able to call a complete list of y values before the generator as they will be computed during the loop in my real function. Is there any way around this? This is super easy to do with pyplot, but I need to use Bokeh for its interactive plots.



Thanks!










share|improve this question














I would like to use a loop as a generator to create individual glyphs to generate a scatter plot. My x values are categorical values. I'm starting from the following simple example.



from bokeh.plotting import figure, show

xvals = ['one', 'two', 'three']
p = figure(x_range=xvals)

i=1
for value in xvals:
p.circle(x=value,y=i)
i+=1

show(p)


This results in Bokeh throwing the error:




Bokeh Error attempted to retrieve property array for nonexistent field
'one'




I'm guessing this can be sorted by using columndatasource and passing it as the source to the glyph rendering function. I've tried various ways to structure the data and pass it to the renderer, but without luck. The columndatasource object wants to be passed a dictionary with the format:



data = {'x_values': [1, 2, 3, 4, 5],
'y_values': [6, 7, 2, 3, 6]}


I am not able to call a complete list of y values before the generator as they will be computed during the loop in my real function. Is there any way around this? This is super easy to do with pyplot, but I need to use Bokeh for its interactive plots.



Thanks!







python bokeh scatter-plot






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Jan 2 at 21:05









JeremyDJeremyD

4527




4527













  • I'm guessing from the crickets that this is not possible. Can bokeh handle scatter plots with multiple y values for each x value? With categorical data?

    – JeremyD
    Jan 8 at 13:33











  • For anyone who is trying to accomplish similar, I was not able to get this approach to work. I instead wrote a generator function to create a pandas dataframe which I then fed back to the glyph renderer using the ColumnDataSource object. I will post a minimal example below.

    – JeremyD
    Jan 9 at 13:51



















  • I'm guessing from the crickets that this is not possible. Can bokeh handle scatter plots with multiple y values for each x value? With categorical data?

    – JeremyD
    Jan 8 at 13:33











  • For anyone who is trying to accomplish similar, I was not able to get this approach to work. I instead wrote a generator function to create a pandas dataframe which I then fed back to the glyph renderer using the ColumnDataSource object. I will post a minimal example below.

    – JeremyD
    Jan 9 at 13:51

















I'm guessing from the crickets that this is not possible. Can bokeh handle scatter plots with multiple y values for each x value? With categorical data?

– JeremyD
Jan 8 at 13:33





I'm guessing from the crickets that this is not possible. Can bokeh handle scatter plots with multiple y values for each x value? With categorical data?

– JeremyD
Jan 8 at 13:33













For anyone who is trying to accomplish similar, I was not able to get this approach to work. I instead wrote a generator function to create a pandas dataframe which I then fed back to the glyph renderer using the ColumnDataSource object. I will post a minimal example below.

– JeremyD
Jan 9 at 13:51





For anyone who is trying to accomplish similar, I was not able to get this approach to work. I instead wrote a generator function to create a pandas dataframe which I then fed back to the glyph renderer using the ColumnDataSource object. I will post a minimal example below.

– JeremyD
Jan 9 at 13:51












1 Answer
1






active

oldest

votes


















0














The ColumnDataSource object must be used. Here is a way to implement a generator for y values with categorical x values using a pandas dataframe.



import pandas
from bokeh.plotting import figure, show
from bokeh.models import ColumnDataSource
from random import randrange

xvals = ['one', 'two', 'three', 'four']
yvals =

#Here is the generator function
for num in xvals:
yvals.append(randrange(0,10))

#Construct a dataframe from generator function
df=pandas.DataFrame({'XVals': xvals, 'YVals': yvals})
source = ColumnDataSource(df)

#Create the plot
p = figure(x_range=xvals)
p.circle(x='XVals',y='YVals', source=source)
show(p)





share|improve this answer
























    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54013172%2fusing-for-loop-generator-to-make-bokeh-scatter-plot-with-categorical-values%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    0














    The ColumnDataSource object must be used. Here is a way to implement a generator for y values with categorical x values using a pandas dataframe.



    import pandas
    from bokeh.plotting import figure, show
    from bokeh.models import ColumnDataSource
    from random import randrange

    xvals = ['one', 'two', 'three', 'four']
    yvals =

    #Here is the generator function
    for num in xvals:
    yvals.append(randrange(0,10))

    #Construct a dataframe from generator function
    df=pandas.DataFrame({'XVals': xvals, 'YVals': yvals})
    source = ColumnDataSource(df)

    #Create the plot
    p = figure(x_range=xvals)
    p.circle(x='XVals',y='YVals', source=source)
    show(p)





    share|improve this answer




























      0














      The ColumnDataSource object must be used. Here is a way to implement a generator for y values with categorical x values using a pandas dataframe.



      import pandas
      from bokeh.plotting import figure, show
      from bokeh.models import ColumnDataSource
      from random import randrange

      xvals = ['one', 'two', 'three', 'four']
      yvals =

      #Here is the generator function
      for num in xvals:
      yvals.append(randrange(0,10))

      #Construct a dataframe from generator function
      df=pandas.DataFrame({'XVals': xvals, 'YVals': yvals})
      source = ColumnDataSource(df)

      #Create the plot
      p = figure(x_range=xvals)
      p.circle(x='XVals',y='YVals', source=source)
      show(p)





      share|improve this answer


























        0












        0








        0







        The ColumnDataSource object must be used. Here is a way to implement a generator for y values with categorical x values using a pandas dataframe.



        import pandas
        from bokeh.plotting import figure, show
        from bokeh.models import ColumnDataSource
        from random import randrange

        xvals = ['one', 'two', 'three', 'four']
        yvals =

        #Here is the generator function
        for num in xvals:
        yvals.append(randrange(0,10))

        #Construct a dataframe from generator function
        df=pandas.DataFrame({'XVals': xvals, 'YVals': yvals})
        source = ColumnDataSource(df)

        #Create the plot
        p = figure(x_range=xvals)
        p.circle(x='XVals',y='YVals', source=source)
        show(p)





        share|improve this answer













        The ColumnDataSource object must be used. Here is a way to implement a generator for y values with categorical x values using a pandas dataframe.



        import pandas
        from bokeh.plotting import figure, show
        from bokeh.models import ColumnDataSource
        from random import randrange

        xvals = ['one', 'two', 'three', 'four']
        yvals =

        #Here is the generator function
        for num in xvals:
        yvals.append(randrange(0,10))

        #Construct a dataframe from generator function
        df=pandas.DataFrame({'XVals': xvals, 'YVals': yvals})
        source = ColumnDataSource(df)

        #Create the plot
        p = figure(x_range=xvals)
        p.circle(x='XVals',y='YVals', source=source)
        show(p)






        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Jan 9 at 13:54









        JeremyDJeremyD

        4527




        4527
































            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54013172%2fusing-for-loop-generator-to-make-bokeh-scatter-plot-with-categorical-values%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            MongoDB - Not Authorized To Execute Command

            How to fix TextFormField cause rebuild widget in Flutter

            in spring boot 2.1 many test slices are not allowed anymore due to multiple @BootstrapWith