条形图截断轴标题

-1 投票
1 回答
2967 浏览
提问于 2025-04-18 05:33

我想画一个柱状图,想在图的竖直方向上加上标签和标题。

下面这个脚本可以画出图,但它把x轴的标签和标题给截断了。即使我试着把图放大,还是会有一点被截掉。而且每次运行这个脚本,我都得运行两次。第一次运行的时候会报一个关于字体设置的错误,但第二次就能正常工作了。

有没有人知道怎么才能不让它截掉呢?还有,我现在只能把屏幕上显示的图保存下来,因为保存功能好像有点问题。

谢谢!

import numpy
import matplotlib
import matplotlib.pylab as pylab
import matplotlib.pyplot
import pdb
from collections import Counter


phenos = [128, 20, 0, 144, 4, 16, 160, 136, 192, 128, 20, 0, 4, 16, 144, 130, 136, 132, 22, 
128, 160, 4, 0, 36, 132, 136, 130, 128, 22, 4, 0, 144, 160, 130, 132, 
128, 4, 0, 136, 132, 68, 130, 192, 8, 128, 4, 0, 20, 22, 132, 144, 192, 130, 2, 
128, 4, 0, 132, 20, 136, 144, 192, 64, 130, 128, 4, 0, 144, 132, 192, 20, 16, 136, 
128, 4, 0, 130, 160, 132, 192, 2,  128, 4, 0, 132, 68, 160, 192, 36, 64, 
128, 4, 0, 136, 192, 8, 160, 36, 128, 4, 0, 22, 20, 144, 132, 160,
128, 4, 0, 132, 20, 192, 144, 160, 68, 64, 128, 4, 0, 132, 160, 144, 136, 192, 68, 20]



from collections import Counter
import numpy as np
import matplotlib.pyplot as plt
from operator import itemgetter


c = Counter(phenos).items()
c.sort(key=itemgetter(1))

font = {'family' : 'sanserif',
        'color'  : 'black',
        'weight' : 'normal',
        'size'   : 22,
        }

font2 = {'family' : 'sansserif',
        'color'  : 'black',
        'weight' : 'normal',
        'size'   : 18,
        }
labels, values = zip(*c)
labels = ("GU", "IT", "AA", "SG", "A, IGI", "A, SG", "GU, A, AA", "D, GU", "D, IT", "A, AA", "D, IGI", "D, AA", "192", "D, A", "D, H", "H", "A")
pylab.show()
pylab.draw()

indexes = np.arange(0, 2*len(labels), 2)
width = 2
plt.bar(indexes, values, width=2, color="blueviolet")
plt.xlabel("Phenotype identifier", fontdict=font)
plt.ylabel("Number of occurances in top 10 \n phenotypes for cancerous tumours", fontdict=font)
#plt.title("Number of occurances for different phenotypes \n in top 10 subclones of a tumour", fontdict=font2)
plt.xticks(indexes + width * 0.5, labels, rotation='vertical', fontdict=font2)
plt.figure(figsize=(8.0, 7.0))
pictureFileName2 = "..\\Stats\\"  + "Phenos2.png"
pylab.savefig(pictureFileName2, dpi=800)


#fig.set_size_inches(18.5,10.5)
#plt.savefig('test2png.png',dpi=100)

1 个回答

3

三个问题:

1. 不是说第一次运行代码不行,第二次就能行。原因是你在绘图之前就调用了 .show()。第一次运行代码时,程序在错误提示的地方停下了。第二次运行时,.show() 先执行,所以之前部分完成的图就显示出来了。

2. fontdict=font2 这些写法其实是不必要的,甚至是错误的。你只需要用 **font2 这样的写法就可以了。

3. 关于被截断的刻度标签,有很多种方法可以解决这个问题,基本的思路是增加图周围的空白区域,其他的选择包括:

plt.gcf().subplots_adjust(bottom=0.35, top=0.7) #adjusting the plotting area

plt.tight_layout() #may raise an exception, depends on which backend is in use

plt.savefig('test.png', bbox_inches='tight', pad_inches = 0.0) #use bbox and pad, if you only want to change the saved figure.  

撰写回答