Генерация списков/отчетов со встроенными сводками в Django

Вы можете попробовать использовать аргумент widths из grid.arrange. Вам нужно будет определить соотношение всех итоговых диаграмм Венна. В вашем примере отношение общего размера составляет 800:110, то есть 7.27, поэтому, если вы сделаете grid.arrange(plot(fit1), plot(fit2), ncol = 2, widths = c(7.27, 1)), то fit2 будет намного меньше, чем fit1. Функция ggarrange() из ggpubr также должна работать.

fit1 <- euler(c(A=300, B=500, "A&B"=100))
fit2 <- euler(c(A=40, B=70, "A&B"=30))

tot1 <- 800
tot2 <- 110
ratio_v <- tot1/tot2

grid.arrange(plot(fit1), plot(fit2), ncol = 2, widths = c(ratio_v, 1))
ggpubr:ggarrange(plotlist = list(plot(fit1), plot(fit2)), ncol = 2, widths = c(ratio_v, 1))

enter image description here

Редактировать: хотите, чтобы отдельные попарные наборы имели собственные соотношения размеров вместо всего, что связано с глобальным максимумом. Это простой пример, но вы можете написать функцию, которая будет делать это автоматически для каждого. В основном установите максимальное количество столбцов (я просто выбрал 100), а затем преобразуйте каждое из ваших соотношений в 100. Создайте строку для каждого набора диаграмм Венна, затем rbind все их в матрицу и используйте [1111 ] аргумент.

### Make fits
fit1 <- euler(c(A=300, B=500, "A&B"=100))
fit2 <- euler(c(A=40, B=70, "A&B"=30))
fit3 <- euler(c(C=100, D=300, "C&D"=50))
fit4 <- euler(c(C=50, D=80, "C&D"=30))

### Assign totals 
tot1 <- 800
tot2 <- 110
tot3 <- 400
tot4 <- 130

### Find ratios
ratioAB_v <- round(tot1/tot2)
ratioCD_v <- round(tot3/tot4)

### Convert ratios
smallAB_v <- round(1/ratioAB_v*100)
smallCD_v <- round(1/ratioCD_v*100)

### Make rows
row1_v <- c(rep(1, (100-smallAB_v)), rep(2, smallAB_v))
row2_v <- c(rep(3, (100-smallCD_v)), rep(4, smallCD_v))

### Make matrix
mat <- rbind(row1_v, row2_v)

### Plot
grid.arrange(plot(fit1), plot(fit2), plot(fit3), plot(fit4), layout_matrix = mat)

enter image description here

6
задан Bartek 13 February 2009 в 15:37
поделиться

3 ответа

Промежуточные итоги SELECT SUM(qty) GROUP BY order_number вещи.

Они являются совершенно отдельными от запроса для получения деталей.

Результаты двух запросов должны быть чередованы. Хороший способ сделать это должно создать каждый порядок как кортеж ( list_of_details, appropriate summary ).

Затем дисплей легок

{% for order in orderList %}
    {% for line in order.0 %}
        {{ line }}
    {% endfor %}
    {{ order.1 }}
{% endfor %}

Твердая часть чередует два запроса.

details = Line.objects.all()
ddict = defaultdict( list )
for d in details:
    ddict[d.order_number].append(d)

interleaved= []
subtotals = ... Django query to get subtotals ... 
for s in subtotals:
    interleaved.append( ( ddict[s.order], s.totals ) )

Это interleaved объект может быть дан Вашему шаблону для рендеринга.

3
ответ дан 17 December 2019 в 04:52
поделиться

Вы могли вычислить промежуточные итоги в Python в представлении Django.

Промежуточные итоги могли быть сохранены в экземплярах Объекта модели с атрибутом, указывающим, что это - промежуточный итог. Для хранения шаблона отчета простым, Вы могли вставить объекты промежуточного итога в правильные места в результате, перечисляют и используют атрибут промежуточного итога для рендеринга строк промежуточного итога по-другому.

1
ответ дан 17 December 2019 в 04:52
поделиться

Принятие Вас не собирается использовать любые определенные для порядка поля, Вы могли выполнить единственный запрос DB, сопровождаемый некоторыми вычислениями Python:

from itertools import groupby
items = OrderItem.objects.select_related('order').order_by('order').all() # order_by is essential
items_by_order = dict(groupby(items, lambda x: x.order))
for order, items in items_by_order:
    items_by_order[order]['subtotals'] = ... # calculate subtotals for all needed fields

Это - больше универсального подхода по сравнению с использованием separeate SQL-запрос для вычисления промежуточных итогов, который налагает ответственность синхронизации операторов Where на обоих запросах. Можно также использовать любую совокупную функцию, не только thoses доступный на стороне DB.

1
ответ дан 17 December 2019 в 04:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: