У меня проблемы с созданием графика компоновки сетки с использованием двух разных пакетов venn, первый - это matplot-venn, а другой - пакет venn для пересечения более чем трех подмножеств. Проблема с пакетом venn заключается в том, что он создает новую фигуру и ось, поэтому я создаю все графики в функции, а затем добавляю их к своей составной фигуре. Исходная сетка размещена правильно (img1), также при добавлении подзаголовков с соответствующей gridSpe c координаты верны, но при построении макета полностью отключена (img2). Во-первых, это кажется только половиной фигуры x используется ось, и 4 маленьких венна должны быть примерно того же размера и ряда, что и два больших слева.
img1 правильный макет сетки
img2 неправильный макет
Я пробовал несколько других вещей, например, настройку параметров, таких как автомасштабирование, сжатие, отсечение или спецификации подзаголовков и т. Д. c. , к сожалению, все с тем же результатом.
Я работаю на сервере и подключаюсь через s sh плюс xforwarding, используя ma c (кварц) или windows (xming) и проблема присутствует на обеих машинах.
Я новичок в python черчении, поэтому любая помощь или предложения приветствуются
большое спасибо
import os
import re
import copy
import pandas as pd
import venn # for 4 way venns, non proportional
import matplotlib.pyplot as plt
from matplotlib_venn import venn3
from matplotlib.gridspec import GridSpec
from matplotlib.patches import Rectangle
# for ssh connections through windows using a non-interactive backend
# import matplotlib
# matplotlib.use('Agg')
def extractORFName(orfList):
return set([re.sub("(.*)_[0-9]*aa.*","\\1",x) for x in orfList])
def plotValidatedOverlap(orfList,nameList):
labels = venn.get_labels(orfList, fill=['number'])
figX, axVenn = venn.venn5(labels, names=nameList,fontsize=8)
axVenn.get_legend().remove()
v_human = plotVenn3(orfList[0:3],nameList[0:3])
v_mouse = plotVenn3(orfList[1:4],nameList[1:4])
plt.close(figX)
return (axVenn, v_human, v_mouse)
def plotVenn3(orfList,nameList):
fig ,ax = plt.subplots()
out = venn3(orfList,nameList,normalize_to=0.75)
for text in out.set_labels:
text.set_fontsize(8)
for text in out.subset_labels:
if text is not None:
text.set_fontsize(6)
plt.close(fig)
return ax
def copyElement(axList,gs,fig):
for idx in range(0,len(axList)):
print("\n\n### processing idx: %s" % idx)
pos = gs[idx].get_position(fig)
ax = copy.copy(axList[idx])
ax.figure = fig
ax.set_position(pos)
ax.set_subplotspec(gs[idx])
fig.add_subplot(ax,aspect='equal',autoscale_on=True)
fig.axes[idx].set_clip_on(False)
print("axes positions:\t%s" % str(fig.axes[idx].get_position()))
print("gs position:'t%s" % str(pos))
#fig1.canvas.draw()
#input("next axes")
#### data input to create orfList (list of sets as subsets) and nameList (labels of subsets)
fig1, ax = plt.subplots(dpi=100, figsize=(18,8),num="venn")#, squeeze=False, constrained_layout=True)
fig1.axes[0].remove()
gs = GridSpec(nrows=2, ncols=3, width_ratios=[2,1,1], figure=fig1)
figsToPlot = sum([ list(plotValidatedOverlap(orfList[type],nameList)) for type in orfList ],[])
fig1.clear()
fig1.suptitle(cellType + "_" + method + "_overlap")
fig1.canvas.draw()
copyElement(figsToPlot,gs,fig1)
fig1.tight_layout()
fig1.canvas.draw()