web-dev-qa-db-ja.com

DjangoでPlotlyを使用してグラフを作成するにはどうすればよいですか?

ライブラリを使用してモデルのデータ(記事)を分析できるダッシュボードを作成しようとしています plotly

Plotlyの棒グラフがテンプレートに表示されていません。以下のコードにエラーがないため、何か問題があるのではないかと思います。

models.py

from Django.db import models
from Django.contrib.auth.models import User
import plotly.plotly as py
import plotly.graph_objs as go

class Article(models.Model):
    user = models.ForeignKey(User, default='1')
    titre = models.CharField(max_length=100, unique=True)
    slug = models.SlugField(max_length=40)
    likes = models.ManyToManyField(User, related_name="likes")

    def __str__(self):
        return self.titre

    @property
    def article_chart(self):
        data = [
            go.Bar(
                x=[self.titre], #title of the article
                y=[self.likes.count()] #number of likes on an article
            )
        ]
        plot_url = py.plot(data, filename='basic-bar')

        return plot_url

dashboard.html

<div>{{ article.article_chart }}</div>

棒グラフが表示されないのはなぜですか?なにか提案を ?

13
Hiroyuki Nuri

結果として

py.plot(data, filename='basic-bar')

オフラインHTMLファイルを生成し、このファイルのローカルURLを返すことです

例えばfile:///your_project_pwd/temp-plot.html

Djangoフレームワークでレンダリングする場合は、

  • 使用する <iframe>およびDjango設定でのフォルダの再構築

OR

  • plotly.offlineメソッドを使用して、入力dataでHTMLコードを生成します

私が試した例があります:

figure_or_data = [Scatter(x=[1, 2, 3], y=[3, 1, 6])]

plot_html = plot_html, plotdivid, width, height = _plot_html(
    figure_or_data, True, 'test', True,
    '100%', '100%')

resize_script = ''
if width == '100%' or height == '100%':
    resize_script = (
        ''
        '<script type="text/javascript">'
        'window.removeEventListener("resize");'
        'window.addEventListener("resize", function(){{'
        'Plotly.Plots.resize(document.getElementById("{id}"));}});'
        '</script>'
    ).format(id=plotdivid)

html = ''.join([
            plot_html,
            resize_script])

return render(request, 'dashboard.html', {'html': html,})
11
samcheuk

上記の答えは非常に役に立ちました、私は実際に親のサイズ変更を監視しています、私はangularで作業しています、そして私はサイズ変更を達成するために以下のコードを使用しました、私は同様の問題を抱えていますそしてこの行コードの

<div class="col-lg-12" ng-if="showME" style="padding:0px">
   <div id="graphPlot" ng-bind-html="myHTML"></div>
</div>

グラフは変数myHTMLを介して挿入されます

私がしたのは、親のサイズ変更を監視し、jqueryを使用してdiv idのみを取得し、それをplotlyに渡して機能したことだけです。

$scope.$on("angular-resizable.resizeEnd", function (event, args){
        Plotly.Plots.resize(document.getElementById($('#graphPlot').children().eq(0).attr("id")));
});
1
Naren Murali