2

我是matplotlib新手,我有一个非常简单(我猜)的问题。

我有一些数据需要用 50x70“单位”的矩形表示(它们是英尺,实际上代表一个房间),但我似乎无法让 matplotlib 在两个轴上绘制一个具有相同比例的矩形并同时保持 50x70 的“尺寸”。

我尝试了以下方法:

import json
import matplotlib
import os
import sys
import traceback
import matplotlib.pyplot as plt

DATA_FILE = os.path.join(os.path.expanduser("~"), "results.json")
FLOOR_DIMENSIONS = (50, 70)

if __name__ == "__main__":
    if len(sys.argv) > 1:
        DATA_FILE = os.path.abspath(sys.argv[0])
    print "Gonna see what happens with file %s" % DATA_FILE
    try:
        with open(DATA_FILE, 'r') as f:
            result_dict = json.load(f)
    except (IOError, OSError, ValueError), e:
        print "Received %s %s when trying to parse json from %s\n"\
        "Showing traceback: %s" % (type(e), e, DATA_FILE, traceback.format_exc())
        result_dict = {}    
    for d_mac in result_dict:
        data = result_dict[d_mac]
        if len(data) < 3:
            continue
        x_s = list(d['x'] for d in data)
        y_s  = list(d['y'] for d in data)
        plt.scatter(x_s, y_s, marker='o', c=numpy.random.rand(5,1), s=15)
    plt.xlim([0, FLOOR_DIMENSIONS[0]])
    plt.ylim([0, FLOOR_DIMENSIONS[1]])
    #plt.axis('equal')
    plt.show()
    sys.exit(0)

这样做,我得到:

在此处输入图像描述

它将我的数据绘制在一个正方形内,改变了 XY 比例(X 是 50 点,Y 是 70,因此 Y 显示“缩小”)

我尝试的另一个选项是取消注释该行plt.axis('equal'),但这会“切割” Y 轴(不是从 0 开始并在 70 结束,而是从 15 开始并以 55 结束,可能是因为没有y < 15和 y的数据> 55)

在此处输入图像描述

但我也不想要那个,我想要从 Y=0 开始到 Y=70 结束的“画布”,如果没有数据就显示一个空白空间。

我需要的是画这样的东西:

在此处输入图像描述

我是通过手动调整渲染绘图的窗口大小得到的:-D

先感谢您!

4

1 回答 1

1

添加plt.axis('scaled').

编辑axis('image')可能更适合您的需求。

更多轴设置可以在文档中找到。

import matplotlib.pyplot as plt
import numpy as np

xs = np.arange(50)
ys = (np.random.random(50)*70) + 15

plt.scatter(xs,ys)

plt.axis('image')
plt.axis([0, 50, 0, 70])

plt.show()

给出:

正确的

在更新的示例中,我知道ys实际最大值约为 85,偏移量只是为了演示正确的轴执行。

于 2013-07-19T16:56:30.077 回答