matplotlib:不要在水平方向压缩绘图

时间:2015-12-13 23:54:30

标签: python matplotlib

我对matplotlib很新,我对这个数字有些困难:

enter image description here

我有一个带有x y点组的文本文件,我应该绘制。但是,每个组中的x点重叠,因此我为每个组的每个x轴点添加一个偏移量。

通常,单个组看起来像这样:

enter image description here enter image description here

请注意,第一张图像中的x轴在第二张图像的x轴开始处结束。

我的问题是结果图像被压制/压缩而不是真正“可读”。

我尝试增加每个组/图像添加到x轴的值,但它只是压缩每个组。

我尝试过使用rcParams的建议或设置生成图片的dpi值,但这项工作没有任何作用:

from pylab import rcParams
rcParams['figure.figsize'] = 50, 100
plt.savefig('result.png', dpi=200,pad_inches=5)

我做错了什么或正在寻找什么?

PS:数据和代码为here。要查看我的问题,请致电python2.7 plotit.py text.txt

1 个答案:

答案 0 :(得分:2)

如果我理解你的问题,你就不要让你的图像在水平方向上过于压缩。这是因为默认情况下matplotlib选择填充给定图形大小所需的宽高比。您正在改变figsize,但是如果您想在rcParams中更改它,则必须在开始绘图之前将此调用放在处。其他方法是使用无状态API,即fig = plt.figure(figsize=(8,2)); s = fig.add_subplot(111); s.plot(...)。这就是你得到的:

from pylab import rcParams
rcParams['figure.figsize'] = 8, 2

enter image description here

请注意,我缩小了圆圈尺寸,以使线条更加清晰:

plt.scatter(x,y,s=1)
if px!='':
    plt.plot([px,x],[py,y],'-o',markersize=1)

为了更准确的控制,您可以直接设置纵横比:

plt.axes().set_aspect(1)

enter image description here

或使用某些预定义模式,例如

plt.axis('equal')
plt.tight_layout()

enter image description here

编辑:作为参考,最终图片的完整代码:

import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import sys

from pylab import rcParams
rcParams['figure.figsize'] = 8, 2

def parsexydata(fdata):
    keys=[]
    xy=[]
    with open(fdata,'r') as f:
        pre=''
        for idx, i in enumerate(f.read().replace('\n','').split(',')[2:]):
            if idx%2==0:
                pre=i
                continue
            tmp = pre.split('.')
            if len(tmp)!=3: continue
            [before,key,after] = pre.split('.')
            pre = before+'.'+after
            if key not in keys: keys.append(key)
            xy.append([pre,i,key])
    return [xy,keys]

[xydata, keys] = parsexydata(sys.argv[1])

for idx, k in enumerate(keys):
    px=py=''
    for [x,y,key] in xydata:
        if key!=k: continue
        x=float(x)+float(k)
        if key=='01': print(x)
        plt.scatter(x,y,s=1)
        if px!='':
            plt.plot([px,x],[py,y],'-o',markersize=1)
        px,py=x,y

plt.axis('equal')
plt.tight_layout()
plt.savefig('result.png', dpi=200)