Git Product home page Git Product logo

django-echarts's Introduction

django-echarts

django-echarts version PyPI - Python Version PyPI - Django Version unittest codecov

A visual site scaffold based on pyecharts and django.

django-echarts 是一个基于pyechartsDjango 整合的可视化网站脚手架。

概述(Summary)

django-echarts 主要提供了以下的内容:

  • 支持 90%+的pyecharts图表类型
  • 页面:主页 / 列表 / 详情 / 关于 / 设置
  • 组件:导航栏 / 网站底部栏 / 热门板块 / 列表 / 合辑 / 关于面板
  • UI主题:Bootstrap3 / Bootstrap5 / Material ,支持更换颜色模式
  • 可灵活扩展: 支持整合 Django用户认证 / 数据库 / Session
  • 基于Django Template Engine 的后端渲染
  • js/css静态文件托管,支持在线/本地切换
  • 生产力工具:代码生成器 / 静态文件下载器
  • 90%+ Python Typing Hints覆盖
  • 单元测试和85%+代码覆盖率

安装(Install)

django-echarts的运行环境要求如下:

django-echarts版本系列 pyecharts & echarts django python
0.6.x 1.9 / 4.8.0 2.0 - 4.1 3.7+
2.0 / 5.4.1 2.0 - 4.1 3.7+
0.5.x 1.9 2.0 - 4.0 3.7+

可以使用 pip 命令安装。

pip install django-echarts

requirements.txt 引用 django-charts时,推荐使用 固定次版本号 的方式。

django-echarts~=0.6

3分钟上手(Quickstart in 3 Minutes)

1. 创建Django项目。

django-admin startproject MyDemo

项目目录结构如下:

MyDemo
  |-- MyDemo
        |-- __init__.py
        |-- asgi.py
        |-- settings.py
        |-- urls.py
        |-- site_views.py
        |-- wsgi.py
  |-- manage.py

2. 添加 django_echarts包和对应的主题包到项目配置模块的 INSTALL_APPS列表。

INSTALL_APPS = (
    # Your apps
    'django_echarts',
    'django_echarts.contrib.bootstrap5'
    # Your apps
)

3. 创建新文件 site_views.py ,输入下列代码。

# ...
from django_echarts.starter.sites import DJESite
from django_echarts.entities import Copyright
from pyecharts import options as opts
from pyecharts.charts import Bar

site_obj = DJESite(site_title='福建统计')

site_obj.add_widgets(copyright_=Copyright(start_year=2022, powered_by='Zinc'))

chart_description = '截止2020年底福建省土地面积1240.29万公顷占我国国土总面积1.3%全省森林面积811.58万公顷森林覆盖率为66.8%连续42年位居全国首位@site_obj.register_chart(title='森林覆盖率', description = chart_description, catalog='基本信息')
def fujian_forest_coverage():
    bar = Bar().add_xaxis(
        ['福州', '厦门', '莆田', '三明', '漳州', '泉州', '南平', '龙岩', '宁德']
    ).add_yaxis(
        '森林覆盖率', [54.7, 45, 58.1, 76.8, 63.4, 61, 75.3, 78, 75]
    ).set_global_opts(
        title_opts=opts.TitleOpts(title="福建省各地市森林覆盖率", subtitle="单位:%"),
        visualmap_opts=opts.VisualMapOpts(is_show=True, max_=100, min_=0)).set_series_opts(
        markline_opts=opts.MarkLineOpts(
            data=[
                opts.MarkLineItem(y=66.8, name="全省"),
            ]
        )
    )
    return bar

在函数fujian_forest_coverage 中编写pycharts代码,返回对应的图表对象。

根据需要修改文字显示,添加组件等。

4. 在项目的路由模块 urls.py 添加挂载点。

from django.conf.urls import url, include
from django.urls import path

from .site_views import site_obj

urlpatterns = [
    # Your urls
    path('', include(site_obj.urls))
]

5. 启动开发服务器,打开浏览器预览结果。

python manage.py runserver 0.0.0.0:8900

运行效果(下图已添加其他组件)

fujian-forest-coverage

文档(Document)

在线文档

Build on Material for MkDocs

示例项目(Demo Project)

在线示例 https://zinc.pythonanywhere.com

参见项目 kinegratii/zinc

截图(Screen Shots)

Home with ValuesPanel (bootstrap5)

home_with_values_panel

Chart Detail Page (bootstrap3.paper)

chart_fj-map-gdp

开源协议(License)

MIT License

django-echarts's People

Contributors

kinegratii avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

django-echarts's Issues

example无法运行

提示 :
ImportError: This loader does not know module django.contrib.messages.migrations

关于本项目

在网页上显示Echarts图表这个问题领域中,该项目与pyecharts的关系,可以和 django-import-exporttablib 关系相类似,它们是实现xlsx/xls/csv/json/yaml 文件数据导入导出功能的非常优秀的开源项目。

django-echarts实现了一个通用的架构,在视图类中构建符合功能需求的 pyecharts.base.Base 对象,将其 _option 值(目前未有public的API),直接返回给前端,最后通过
echartsInstance.setOptions(options) 的前端代码完成渲染。

项目着重于后端开发,因为如果需要更加复杂细致的定制需求,显然将这些放在前端 Echarts 是为一个更好的选择。

项目主要开发内容:

  • 与Django数据查询的整合
  • 与其他功能的整合,尽可能不破坏原有结构
  • 其他待定

图表构建函数支持自定义参数

图表构建函数支持自定义参数,可以根据不同的输入值,加载不同的数据,从而形成多个图表。

以之前的时间轴图表为例子,每次只显示一个年份的数据图表。

@site_obj.register_chart(title='{year}年福建省家庭户类型组成')
def yearly_family(year: int):
    family_types = [
        '一人户', '二人户', '三人户', '四人户', '五人户', '六人户', '七人户', '八人户', '九人户', '十人及其以上'
    ]
    data = [
        [1982, 7.7, 8.2, 12.2, 17.1, 18.4, 14.7, 10.1, 11.6, 0, 0],
        [1990, 5.8, 8.6, 16.8, 23.6, 21.4, 11.8, 5.9, 2.9, 1.4, 1.8],
        [2000, 9.1, 15.5, 25.4, 24.7, 15.8, 5.9, 2.2, 0.8, 0.3, 0.3],
        [2010, 12.1, 17.2, 24.3, 21.7, 13.7, 6.4, 2.6, 1.1, 0.5, 0.4],
        [2020, 27.3, 26.3, 19.4, 14.2, 6.9, 4, 1.1, 0.4, 0.2, 0.2]
    ]
    yearly_data = {item[0]: item[1:] for item in data}
    if year not in yearly_data:
        raise ChartDoesNotExist(f'year={year}')
    year_data = yearly_data[year]
    bar = (
        Bar()
            .add_xaxis(family_types).add_yaxis('百分比(%)', year_data)
            .set_global_opts(title_opts=opts.TitleOpts("福建省家庭户类型构成-{}年".format(year)))
    )
    return bar

说明:

  • year为自定义参数,如未声明类型,默认为 str
  • 如果传入的year找不到对应的数据,抛出 ChartDoesNotExist 异常,web页面显示“找不到图表”的页面。
  • title参数可以使用类似 {year}的模板字符串。

该图表对应的相关引用配置如下(以year=2020例子):

项目 备注
图表URL /chart/year/2020/ 格式:<图表slug>/<参数名称1>/<参数值1>/...
python引用 reverse_lazy('dje_single_chart','yearly_family','year/2020/')
模板引用 {% url 'dje_single_chart' 'yearly_family', 'year/2020/' %}

启动server时ImportError: cannot import name AxisValuesQuerySet

你好,我用的python2.7,在sample下执行python manage.py runserver 127.0.0.1:8000启动server时报导入模块AxisValuesQuerySet出错

C02Q6NMPFVH5:example jackey$ python manage.py runserver 127.0.0.1:8000
Unhandled exception in thread started by <function wrapper at 0x10391d0c8>
Traceback (most recent call last):
File "/Library/Python/2.7/site-packages/django/utils/autoreload.py", line 227, in wrapper
fn(args, **kwargs)
File "/Library/Python/2.7/site-packages/django/core/management/commands/runserver.py", line 117, in inner_run
autoreload.raise_last_exception()
File "/Library/Python/2.7/site-packages/django/utils/autoreload.py", line 250, in raise_last_exception
six.reraise(
_exception)
File "/Library/Python/2.7/site-packages/django/utils/autoreload.py", line 227, in wrapper
fn(*args, **kwargs)
File "/Library/Python/2.7/site-packages/django/init.py", line 27, in setup
apps.populate(settings.INSTALLED_APPS)
File "/Library/Python/2.7/site-packages/django/apps/registry.py", line 108, in populate
app_config.import_models()
File "/Library/Python/2.7/site-packages/django/apps/config.py", line 202, in import_models
self.models_module = import_module(models_module_name)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/init.py", line 37, in import_module
import(name)
File "/Users/jackey/PycharmProjects/django-echarts-master/example/demo/models.py", line 7, in
from django_echarts.datasets.managers import AxisValuesQuerySet
ImportError: cannot import name AxisValuesQuerySet

v0.5.x Development Note (2022)

关于0.5版本系列

概述

django-echarts v0.5.0将会是新版本系列的第一个正式版本,与原有的0.3.x完全不兼容。

使用开发版本

开发版本位于 dev分支,可以通过下面方式安装:

git clone https://github.com/kinegratii/django-echarts.git
cd django-echarts
git checkout -b dev
python setup.py install

如何向模板中传递其他的参数

现在遇到一种情况就是,我除了要向模板文件中传递图表对象之外,还有一些别的变量要传递过去,那么请问我应该怎么做呢。谢谢。
class NamedChartsView(EChartsBackendView):
...
def get_echarts_instance(self, *args, **kwargs):
....
line = Line()
something = 'something'
return line
比如这里我想把 something 也传递过去。

ImportError: cannot import name patterns

res = instance.__dict__[self.name] = self.func(instance)

File "/usr/local/lib/python2.7/site-packages/django/urls/resolvers.py", line 398, in urlconf_module
return import_module(self.urlconf_name)
File "/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/init.py", line 37, in import_module
import(name)
File "/Users/shendonghui/Downloads/city_histogram-master/job_task/urls.py", line 1, in
from django.conf.urls import patterns, include, url
ImportError: cannot import name patterns

django.template.exceptions.TemplateDoesNotExist: snippets/echarts_init_options.tpl

我想要使用该模块在我的毕设中展示数据,但是在quickstart的过程中出现了上述问题, 下面是我的版本详情以及代码
python 3.1
django-echarts 0.5.1
django 3.1.4

urls.py

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include(site_obj.urls))
]

site_views.py

# ...
from django_echarts.starter.sites import DJESite
from django_echarts.entities import Copyright
from pyecharts import options as opts
from pyecharts.charts import Bar

site_obj = DJESite(site_title='福建统计')

site_obj.add_widgets(copyright_=Copyright(start_year=2022, powered_by='Zinc'))

chart_description = '截止2020年底,福建省土地面积1240.29万公顷,占我国国土总面积1.3%。全省森林面积811.58万公顷,森林覆盖率为66.8%,连续42年位居全国首位。'


@site_obj.register_chart(title='森林覆盖率', description=chart_description, catalog='基本信息')
def fujian_forest_coverage():
    bar = Bar().add_xaxis(
        ['福州', '厦门', '莆田', '三明', '漳州', '泉州', '南平', '龙岩', '宁德']
    ).add_yaxis(
        '森林覆盖率', [54.7, 45, 58.1, 76.8, 63.4, 61, 75.3, 78, 75]
    ).set_global_opts(
        title_opts=opts.TitleOpts(title="福建省各地市森林覆盖率", subtitle="单位:%"),
        visualmap_opts=opts.VisualMapOpts(is_show=True, max_=100, min_=0)).set_series_opts(
        markline_opts=opts.MarkLineOpts(
            data=[
                opts.MarkLineItem(y=66.8, name="全省"),
            ]
        )
    )
    return bar

settings.py

"""
Django settings for economic project.

Generated by 'django-admin startproject' using Django 3.1.4.

For more information on this file, see
https://docs.djangoproject.com/en/3.1/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.1/ref/settings/
"""

from pathlib import Path

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.1/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '384$nu%q&rr9czc_iuy1k-(3q33qz0af97y1ktc6g&jcnu6&^v'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = []


# Application definition

INSTALLED_APPS = [
    'django_echarts',
    'django_echarts.contrib.bootstrap5',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'economic.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'economic.wsgi.application'


# Database
# https://docs.djangoproject.com/en/3.1/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}


# Password validation
# https://docs.djangoproject.com/en/3.1/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]


# Internationalization
# https://docs.djangoproject.com/en/3.1/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.1/howto/static-files/

STATIC_URL = '/static/'

报错信息

[01/May/2022 17:49:09] "GET /chart/fujian_forest_coverage/ HTTP/1.1" 500 188347
Internal Server Error: /chart/fujian_forest_coverage/
Traceback (most recent call last):
  File "C:\home\geray\env\python3.7\lib\site-packages\django\template\backends\django.py", line 61, in render
    return self.template.render(context)
  File "C:\home\geray\env\python3.7\lib\site-packages\django\template\base.py", line 170, in render
    return self._render(context)
  File "C:\home\geray\env\python3.7\lib\site-packages\django\template\base.py", line 162, in _render
    return self.nodelist.render(context)
  File "C:\home\geray\env\python3.7\lib\site-packages\django\template\base.py", line 938, in render
    bit = node.render_annotated(context)
  File "C:\home\geray\env\python3.7\lib\site-packages\django\template\base.py", line 905, in render_annotated
    return self.render(context)
  File "C:\home\geray\env\python3.7\lib\site-packages\django\template\loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "C:\home\geray\env\python3.7\lib\site-packages\django\template\base.py", line 162, in _render
    return self.nodelist.render(context)
  File "C:\home\geray\env\python3.7\lib\site-packages\django\template\base.py", line 938, in render
    bit = node.render_annotated(context)
  File "C:\home\geray\env\python3.7\lib\site-packages\django\template\base.py", line 905, in render_annotated
    return self.render(context)
  File "C:\home\geray\env\python3.7\lib\site-packages\django\template\loader_tags.py", line 62, in render
    result = block.nodelist.render(context)
  File "C:\home\geray\env\python3.7\lib\site-packages\django\template\base.py", line 938, in render
    bit = node.render_annotated(context)
  File "C:\home\geray\env\python3.7\lib\site-packages\django\template\base.py", line 905, in render_annotated
    return self.render(context)
  File "C:\home\geray\env\python3.7\lib\site-packages\django\template\library.py", line 192, in render
    output = self.func(*resolved_args, **resolved_kwargs)
  File "C:\home\geray\env\python3.7\lib\site-packages\django_echarts\templatetags\echarts.py", line 60, in echarts_js_content
    contents = build_echarts_initial_fragment(*echarts)
  File "C:\home\geray\env\python3.7\lib\site-packages\django_echarts\templatetags\echarts.py", line 55, in build_echarts_initial_fragment
    return SafeString(render_to_string('snippets/echarts_init_options.tpl', context))
  File "C:\home\geray\env\python3.7\lib\site-packages\django\template\loader.py", line 61, in render_to_string
    template = get_template(template_name, using=using)
  File "C:\home\geray\env\python3.7\lib\site-packages\django\template\loader.py", line 19, in get_template
    raise TemplateDoesNotExist(template_name, chain=chain)
django.template.exceptions.TemplateDoesNotExist: snippets/echarts_init_options.tpl

渲染图表时加载DJANGO_ECHARTS存在问题

1.在渲染多图表的时候,若添加词云,渲染对应的依赖js的时候,对应的百度资源无法使用,'http://echarts.baidu.com/asset/map/js/wordcloud.js ' 访问报404,也找不到wordcloud.js应该是echarts-wordcloud.mini.js,还望修正公共cdndependencies = merge_js_dependencies(*args) dependencies 为echarts和wordcloud
2. 在获取echarts默认设置时存在无论怎么设置只加载默认DEFAULT_SETTINGS 具体方法为:

def get_django_echarts_settings():
    project_echarts_settings = {k: v for k, v in DEFAULT_SETTINGS.items()}
    project_echarts_settings.update(getattr(settings, 'DJANGO_ECHARTS', {}))
    extra_settings = {
        'STATIC_URL': settings.STATIC_URL
    }
    settings_store = SettingsStore(
        echarts_settings=project_echarts_settings,
        extra_settings=extra_settings
    )
    return settings_store
class SettingsStore(object):
    def __init__(self, *, echarts_settings=None, extra_settings=None, **kwargs):
        # Pre check settings

        self._extra_settings = extra_settings or {}
        if  self._extra_settings.get('lib_js_host') == 'local_host':
            self._extra_settings['lib_js_host'] = echarts_settings['local_host']
        if  self._extra_settings.get('map_js_host') == 'local_host':
            self._extra_settings['map_js_host'] = echarts_settings['local_host']

        # Merge echarts settings
        self._settings = {**DEFAULT_SETTINGS, **self._extra_settings}

上述self._extra_settings的值一直是

extra_settings = {
        'STATIC_URL': settings.STATIC_URL
    }

我觉着如果本地有仓库的话应该为:

        if  echarts_settings.get('lib_js_host') == 'local_host':
            self._extra_settings['lib_js_host'] = echarts_settings['local_host']
        if  echarts_settings.get('map_js_host') == 'local_host':
            self._extra_settings['map_js_host'] = echarts_settings['local_host']
DJANGO_ECHARTS = {
    'echarts_version': '4.0.4',
    'renderer': 'svg',
    'lib_js_host': 'local_host',
    'map_js_host': 'local_host',
    'local_host': '/static/js' 本地设置
}

烦请您查看一下,如有误解,还望解答。谢谢

福建统计 始终echarts不显示

我使用快速开始的代码,但是我的第一个网页的“福建统计”始终echarts显示,我是用linux和mac进行了实验,都不显示

Object of type 'Tooltip' is not JSON serializable

TypeError at /demo/options/simplePie/
Object of type 'Tooltip' is not JSON serializable

Django 2.1
django-echarts 0.3.6
pyecharts 0.5.6
pyecharts-javascripthon 0.0.6
pyecharts-jupyter-installer 0.0.3

前端渲染 k线图,bar图,地图,饼图,无法渲染,只有词云可以渲染

这里时Django报错信息

[13/May/2018 16:39:03] "GET /options/simpleKLine/ HTTP/1.1" 500 17958
Internal Server Error: /options/simpleBar/
Traceback (most recent call last):
File "/home/tqw233/cycle/data/django-chartit/chart/lib/python3.5/site-packages/django/core/handlers/exception.py", line 35, in inner
response = get_response(request)
File "/home/tqw233/cycle/data/django-chartit/chart/lib/python3.5/site-packages/django/core/handlers/base.py", line 128, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/home/tqw233/cycle/data/django-chartit/chart/lib/python3.5/site-packages/django/core/handlers/base.py", line 126, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/tqw233/cycle/data/django-chartit/chart/lib/python3.5/site-packages/django/views/generic/base.py", line 69, in view
return self.dispatch(request, *args, **kwargs)
File "/home/tqw233/cycle/data/django-chartit/chart/lib/python3.5/site-packages/django/views/generic/base.py", line 89, in dispatch
return handler(request, *args, **kwargs)
File "/home/tqw233/cycle/data/django-chartit/chart/lib/python3.5/site-packages/django_echarts/views/frontend.py", line 12, in get
return JsonResponse(data=echarts_instance.options, safe=False)
File "/home/tqw233/cycle/data/django-chartit/chart/lib/python3.5/site-packages/django/http/response.py", line 509, in init
data = json.dumps(data, cls=encoder, **json_dumps_params)
File "/usr/lib/python3.5/json/init.py", line 237, in dumps
**kw).encode(obj)
File "/usr/lib/python3.5/json/encoder.py", line 198, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/lib/python3.5/json/encoder.py", line 256, in iterencode
return _iterencode(o, 0)
File "/home/tqw233/cycle/data/django-chartit/chart/lib/python3.5/site-packages/django/core/serializers/json.py", line 104, in default
return super().default(o)
File "/usr/lib/python3.5/json/encoder.py", line 179, in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: <pyecharts.echarts.label.NormalLabel object at 0x7f183e0ece10> is not JSON serializable
ERROR:django.request:Internal Server Error: /options/simpleBar/
Traceback (most recent call last):
File "/home/tqw233/cycle/data/django-chartit/chart/lib/python3.5/site-packages/django/core/handlers/exception.py", line 35, in inner
response = get_response(request)
File "/home/tqw233/cycle/data/django-chartit/chart/lib/python3.5/site-packages/django/core/handlers/base.py", line 128, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/home/tqw233/cycle/data/django-chartit/chart/lib/python3.5/site-packages/django/core/handlers/base.py", line 126, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/tqw233/cycle/data/django-chartit/chart/lib/python3.5/site-packages/django/views/generic/base.py", line 69, in view
return self.dispatch(request, *args, **kwargs)
File "/home/tqw233/cycle/data/django-chartit/chart/lib/python3.5/site-packages/django/views/generic/base.py", line 89, in dispatch
return handler(request, *args, **kwargs)
File "/home/tqw233/cycle/data/django-chartit/chart/lib/python3.5/site-packages/django_echarts/views/frontend.py", line 12, in get
return JsonResponse(data=echarts_instance.options, safe=False)
File "/home/tqw233/cycle/data/django-chartit/chart/lib/python3.5/site-packages/django/http/response.py", line 509, in init
data = json.dumps(data, cls=encoder, **json_dumps_params)
File "/usr/lib/python3.5/json/init.py", line 237, in dumps
**kw).encode(obj)
File "/usr/lib/python3.5/json/encoder.py", line 198, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/lib/python3.5/json/encoder.py", line 256, in iterencode
return _iterencode(o, 0)
File "/home/tqw233/cycle/data/django-chartit/chart/lib/python3.5/site-packages/django/core/serializers/json.py", line 104, in default
return super().default(o)
File "/usr/lib/python3.5/json/encoder.py", line 179, in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: <pyecharts.echarts.label.NormalLabel object at 0x7f183e0ece10> is not JSON serializable

v0.6.x Devlopment Note(2023)

1 运行环境支持

django-echarts v0.6.0默认使用 pyecharts 2.x 作为底层渲染库,其最大的变化是 echarts 版本由 4.8 升级至 5.4。

django-echarts 依赖库更新如下:

pyecharts 1.9 -> 2.0
typing_extensions 4.0 -> 4.5
borax 3.5 -> 4.0

2 图表构建函数支持自定义参数

图表构建函数支持自定义参数,可以根据不同的输入值,加载不同的数据,从而形成多个图表。

以之前的时间轴图表为例子,每次只显示一个年份的数据图表。

@site_obj.register_chart(title='{year}年福建省家庭户类型组成')
def yearly_family(year: int):
    family_types = [
        '一人户', '二人户', '三人户', '四人户', '五人户', '六人户', '七人户', '八人户', '九人户', '十人及其以上'
    ]
    data = [
        [1982, 7.7, 8.2, 12.2, 17.1, 18.4, 14.7, 10.1, 11.6, 0, 0],
        [1990, 5.8, 8.6, 16.8, 23.6, 21.4, 11.8, 5.9, 2.9, 1.4, 1.8],
        [2000, 9.1, 15.5, 25.4, 24.7, 15.8, 5.9, 2.2, 0.8, 0.3, 0.3],
        [2010, 12.1, 17.2, 24.3, 21.7, 13.7, 6.4, 2.6, 1.1, 0.5, 0.4],
        [2020, 27.3, 26.3, 19.4, 14.2, 6.9, 4, 1.1, 0.4, 0.2, 0.2]
    ]
    yearly_data = {item[0]: item[1:] for item in data}
    if year not in yearly_data:
        raise ChartDoesNotExist(f'year={year}')
    year_data = yearly_data[year]
    bar = (
        Bar()
            .add_xaxis(family_types).add_yaxis('百分比(%)', year_data)
            .set_global_opts(title_opts=opts.TitleOpts("福建省家庭户类型构成-{}年".format(year)))
    )
    return bar

说明:

  • year为自定义参数,如未声明类型,默认为 str
  • 如果传入的year找不到对应的数据,抛出 ChartDoesNotExist 异常,web页面显示“找不到图表”的页面。
  • title参数可以使用类似 {year}的模板字符串。

该图表对应的相关引用配置如下(以year=2020例子):

项目 备注
图表URL /chart/year/2020/ 格式:<图表slug>/<参数名称1>/<参数值1>/...
python引用 reverse_lazy('dje_single_chart','yearly_family','year/2020/')
模板引用 {% url 'dje_single_chart' 'yearly_family', 'year/2020/' %}

2 新增声明式导航栏配置

django-echarts 0.6 新增了使用字典方式一次性配置导航栏配置。

# site_config.py

nav_config = {
    'nav_left': ['home', 'list'],
    'nav_right': ['settings'],
    'nav_footer': [
        {'text': '项目主页', 'slug': 'project_url', 'url': 'https://github.com/kinegratii/django-echarts'}
    ]
}

# urls.py

site_obj.config_nav(nav_config)

3 DJESite类移除导航栏相关方法

可使用 DJESite.nav 相关方法,参见下面的Nav API章节。

  • DJESite.add_left_link
  • DJESite.add_right_link
  • DJESite.add_footer_link
  • DJESite.add_menu_item

4 ChartInfo和ChartInfoManager

  • ChartInfo 增加 is_bound 布尔值属性,如果对应图表注册函数携带任何参数,则设置为 False,数据格式化后变为True
  • ChartInfoManagerMixin.get_or_none 增加 uri 参数。
  • is_bound = False 情况下,body title description的转义处理

多个地图同时渲染tooltip出现错误

多个地图同时渲染时,数据视图里面会出现除经纬度外的多个值,且tooltip点击对应城市,上方显示的值竟然是纬度值。
问题应该是因为echarts里默认图像不合并,前面渲染的数据未被覆盖或清空。
按照参考的代码把其他的都做出来了,但是多地图这一块一直没有找到好的解决方案。
之前又看到设置EchartInstance.clear或者myechart.setOption(option,true)之类的方法,试过在{% block extra_script %}里面写{% echart_instance.clear %}但是没有效果。
请问,这个问题怎么解决比较好呢?
image

另外,echart_instance.page_title可以显示出来,请问,有没有获取echart_intance对应的name和value的方法呢?

安装方法

django-echarts 的 requirements.txt 文件 不包含 pyecharts 和 django 两个库,请阅读以下文字后,选择安装 django-echarts。

注意 django-echarts 暂未适配 pyecharts v0.5.x ,敬请期待。

pyecharts

请根据你的 pyecharts 版本安装 django-echarts 。

django-echarts pyecharts 备注
0.3.x 0.3.x - 0.4.x

Python & Django

django-echarts 只支持

  • Python3.5+
  • Django 1.11 LTS 或 Django 2.0+

安装方式

可以使用 pip 在线安装。

pip install django-echarts

或者使用源码构建

git clone https://github.com/kinegratii/django-echarts.git
cd django-echarts
python setup.py install

example 中 温度图表实例访问报 RecursionError 错误

访问 http://127.0.0.1:8000/demo/temperature/ 报递归错误


Request Method: | GET
-- | --
http://127.0.0.1:8000/demo/temperature/
2.0
RecursionError
maximum recursion depth exceeded while calling a Python object
E:\projects\django-echarts\django_echarts\views\backend.py in get_context_data, line 13

相关代码

class TemperatureEChartsView(EChartsBackendView):
echarts_instance_name = 'line'
template_name = 'temperature_charts.html'
def get_echarts_instance(self, **kwargs):
context = super(TemperatureEChartsView, self).get_context_data(**kwargs)
t_data = models.TemperatureRecord.objects.all().order_by('create_time').values_list('high', 'create_time')
hs, ds = zip(*t_data)
line = Line('High Temperature')
line.add('High', ds, hs)
context['line'] = line
return context

Javascript文件托管功能重构和强化

为因应上游库(pyecharts)的变化:

  • pyecharts v0.3.2+ ,地图文件独立打包和发行
  • pyecharts 地图管理 API 相对封闭

以及django-echarts 的存在的问题:

  • django-echarts 未实现 pyecharts 地图管理的若干功能
  • django-echarts 对于相关概念的混用

需要针对 JS 文件托管功能进行重构。遵循的主要原则:

  • 由于web 项目的特点,django-echarts 认为 js 基于项目,这一点和 pyecharts 是最大的不同。
  • django-echarts 本身不托管任何 js 文件,如若提供,仅作为一个样例存在,不具有通用性

重构和强化的内容包括:

  • 重新理顺相关数据处理过程
  • 提供更为强大的配置以因应大多数的使用场景
  • 重命名部分不合功能和实际的变量、函数、类名称

附:

django-echarts-js-path

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.