Best tool for printing tables in Jupyter notebook?

Lets say I had something like:

 var | expected_value | actual_value
-----|----------------|--------------
 a   |        5       |       5
 s   |        8       |       8
 d   |       13       |      14
 f   |       21       |      23
 z   |       34       |      35

What’s the best tool for printing the table in Jupyter so it looks nicer than just a pretty print?


edit: could just look something like datatables.js. // note the .js, not .jl

I would just put it in a DataFrame. Doesn’t that do a pretty print?

I want it to look more like the output from:

display("text/html", "<h2 style='padding: 10px'>Arc</h2><table class='table table-striped'> <thead> <tr> <th>#</th> <th>First Name</th> <th>Last Name</th> <th>Username</th> </tr> </thead> <tbody> <tr> <th scope='row'>1</th> <td>Mark</td> <td>Otto</td> <td>@mdo</td> </tr> <tr> <th scope='row'>2</th> <td>Jacob</td> <td>Thornton</td> <td>@fat</td> </tr> <tr> <th scope='row'>3</th> <td>Larry</td> <td>the Bird</td> <td>@twitter</td> </tr> </tbody> </table>")

i.e.

1 Like

Not as pretty as your table, but FWIW this is what I use:

module HTMLElements

export table, fields_table

function table(arr::Matrix; pre=true, column_names=nothing)
    if column_names !== nothing
        arr = vcat(reshape(column_names, 1, length(column_names)), arr)
    end
    s =
    """
    <table border="1">
    """
    for r in 1:size(arr, 1)
        s *= "<tr>"
        for c in 1:size(arr, 2)
            s *= "<td>"
            if pre s *= "<pre>" end
            s *= string(arr[r, c])
            if pre s *= "</pre>" end
        end
        s *= "</tr>"
    end
    s *= "</table>"
    return HTML(s)
end

table(ass::Associative; kwargs...) = table(ass...; kwargs...)
table(pairs::Pair...; kwargs...) =
    table(hcat([x[1] for x in pairs], [x[2] for x in pairs]); kwargs...)


""" `fields_table(obj)` displays the fields of object in an HTML table """
fields_table(obj) =
    table(Pair[name=>getfield(obj, name) for name in fieldnames(obj)]...)

end

2 Likes

I agree this is a step in the right direction, but I don’t think we’re at the solution yet

two questions,

  • what was your reasoning for adding the <pre> tags?
  • does this link up with DataFrames.jl out of the box?

// update: durrrr… <pre> tags use monospace font

Set this up with as a DataStream Sink, and it will support DataFrames, DataTables, …

But I think this would be a nice package to have accessible somewhere.

1 Like

No reason; it’s just easier on the eyes for the kind of data that I’m working with.

I wrote this up. It’s basically just @cstjean’s code from above:

There’s probably more to be done on it

module HTMLElements

  export table

  function table(cur_matrix::Matrix; header_row=[], title=nothing)

    cur_table = ""

    if title != nothing
      cur_table *= "<h2 style='padding: 10px'>$title</h2>"
    end

    cur_table *= "<table class='table table-striped'>"

    if !isempty(header_row)
      cur_table *= "<thead><tr>"

      for cur_header in header_row
        cur_table *= "<th>$cur_header</th>"
      end

      cur_table *= "</tr></thead>"
    end

    cur_table *= "<tbody>"

    for ii in 1:size(cur_matrix, 1)

      cur_table *= "<tr>"

      for jj in 1:size(cur_matrix, 2)
        cur_table *= "<td>"

        cur_table *= string(cur_matrix[ii, jj])

        cur_table *= "</td>"
      end

      cur_table *= "</tr>"

    end

    cur_table *= "</tbody>"

    cur_table *= "</table>"

    return HTML(cur_table)

  end

end
1 Like

This is very similar to the format in the new version of the notebook (5.0). Install it via

julia> using Conda
julia> Conda.update()

Blog post: http://blog.jupyter.org/2017/04/04/jupyter-notebook-5-0/

1 Like

How do I make that table though?

I’m guessing it’s not done with println’s or display("text/html", "...")'s

Markdown table syntax.

I don’t think that will work.

I was trying to wrap this in a @manipulate

Ah, then no. You will effectively have to use the html output I guess, but as someone suggested, doesn’t DataFrames or whatever already have this? So just make am object of the relevant type.