Thay đổi khoảng lưới và chỉ định nhãn đánh dấu trong Matplotlib


82

Tôi đang cố gắng tính toán số lượng trong các ô có lưới, nhưng tôi không thể tìm ra cách tôi thực hiện nó. Tôi muốn:

  1. Có lưới chấm ở khoảng cách 5

  2. Chỉ có các nhãn đánh dấu chính sau mỗi 20

  3. Tôi muốn bọ ve ở bên ngoài cốt truyện.

  4. Có "số lượng" bên trong các lưới đó

Tôi đã kiểm tra các bản sao có thể xảy ra như ở đâyở đây , nhưng tôi không thể tìm ra.

Đây là mã của tôi.

import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator, FormatStrFormatter

for key, value in sorted(data.items()):
    x = value[0][2]
    y = value[0][3]
    count = value[0][4]

    fig = plt.figure()
    ax = fig.add_subplot(111)

    ax.annotate(count, xy = (x, y), size = 5)
    # Overwrites and I only get the last data point

    plt.close()
    # Without this, I get "fail to allocate bitmap" error

plt.suptitle('Number of counts', fontsize = 12)
ax.set_xlabel('x')
ax.set_ylabel('y')
plt.axes().set_aspect('equal')

plt.axis([0, 1000, 0, 1000])
# This gives an interval of 200

majorLocator   = MultipleLocator(20)
majorFormatter = FormatStrFormatter('%d')
minorLocator   = MultipleLocator(5)
# I want minor grid to be 5 and major grid to be 20
plt.grid()

filename = 'C:\Users\Owl\Desktop\Plot.png'
plt.savefig(filename, dpi = 150)
plt.close()

Đây là những gì tôi nhận được.

Đây là những gì tôi nhận được.

Tôi cũng gặp sự cố ghi đè các điểm dữ liệu. Ai có thể XIN giúp tôi với vấn đề này?

Câu trả lời:


186

Có một số vấn đề trong mã của bạn.

Đầu tiên là những cái lớn:

  1. Bạn đang tạo một hình mới và một trục mới trong mỗi lần lặp lại vòng lặp của bạn → đặt fig = plt.figureax = fig.add_subplot(1,1,1)bên ngoài vòng lặp.

  2. Không sử dụng Bộ định vị. Gọi các chức năng ax.set_xticks()ax.grid()với các từ khóa chính xác.

  3. Với việc plt.axes()bạn đang tạo lại một trục mới. Sử dụng ax.set_aspect('equal').

Những điều nhỏ: Bạn không nên trộn cú pháp giống MATLAB như plt.axis()với cú pháp mục tiêu. Sử dụngax.set_xlim(a,b)ax.set_ylim(a,b)

Đây phải là một ví dụ tối thiểu hoạt động:

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)

# Major ticks every 20, minor ticks every 5
major_ticks = np.arange(0, 101, 20)
minor_ticks = np.arange(0, 101, 5)

ax.set_xticks(major_ticks)
ax.set_xticks(minor_ticks, minor=True)
ax.set_yticks(major_ticks)
ax.set_yticks(minor_ticks, minor=True)

# And a corresponding grid
ax.grid(which='both')

# Or if you want different settings for the grids:
ax.grid(which='minor', alpha=0.2)
ax.grid(which='major', alpha=0.5)

plt.show()

Đầu ra là:

kết quả


2
Cảm ơn bạn rất nhiều cho câu trả lời của bạn! Bạn đã giải quyết vấn đề của tôi! Để đặt bọ ve bên ngoài, tôi chỉ cần thêm ax.tick_params (which = 'both', direction = 'out').

29

Một giải pháp thay thế tinh tế cho câu trả lời của MaxNoe trong đó bạn không đặt dấu tích rõ ràng mà thay vào đó đặt nhịp.

import matplotlib.pyplot as plt
from matplotlib.ticker import (AutoMinorLocator, MultipleLocator)

fig, ax = plt.subplots(figsize=(10, 8))

# Set axis ranges; by default this will put major ticks every 25.
ax.set_xlim(0, 200)
ax.set_ylim(0, 200)

# Change major ticks to show every 20.
ax.xaxis.set_major_locator(MultipleLocator(20))
ax.yaxis.set_major_locator(MultipleLocator(20))

# Change minor ticks to show every 5. (20/4 = 5)
ax.xaxis.set_minor_locator(AutoMinorLocator(4))
ax.yaxis.set_minor_locator(AutoMinorLocator(4))

# Turn grid on for both major and minor ticks and style minor slightly
# differently.
ax.grid(which='major', color='#CCCCCC', linestyle='--')
ax.grid(which='minor', color='#CCCCCC', linestyle=':')

Lưới tùy chỉnh Matplotlib

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.