Вы можете попробовать использовать аргумент 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))
Редактировать: хотите, чтобы отдельные попарные наборы имели собственные соотношения размеров вместо всего, что связано с глобальным максимумом. Это простой пример, но вы можете написать функцию, которая будет делать это автоматически для каждого. В основном установите максимальное количество столбцов (я просто выбрал 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)
Промежуточные итоги 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
объект может быть дан Вашему шаблону для рендеринга.
Вы могли вычислить промежуточные итоги в Python в представлении Django.
Промежуточные итоги могли быть сохранены в экземплярах Объекта модели с атрибутом, указывающим, что это - промежуточный итог. Для хранения шаблона отчета простым, Вы могли вставить объекты промежуточного итога в правильные места в результате, перечисляют и используют атрибут промежуточного итога для рендеринга строк промежуточного итога по-другому.
Принятие Вас не собирается использовать любые определенные для порядка поля, Вы могли выполнить единственный запрос 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.