неверно размещенные подзаголовки с использованием диаграмм Венна и GridSpe c [python / matplotlib] - PullRequest
1 голос
/ 11 июля 2020

У меня проблемы с созданием графика компоновки сетки с использованием двух разных пакетов 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...