Matplotlib'de ızgara aralığını değiştirin ve onay etiketlerini belirtin


84

Sayımları ızgaralı arazilerde çizmeye çalışıyorum, ancak bunu nasıl yapacağımı çözemiyorum. İstiyorum:

  1. 5 aralıklı noktalı ızgaralar var

  2. Yalnızca 20'de bir büyük kene etiketlerine sahip olun

  3. Kenelerin olay örgüsünün dışında olmasını istiyorum.

  4. Bu ızgaraların içinde "sayımlar" var

Burada ve burası gibi olası kopyaları kontrol ettim , ancak çözemedim.

Bu benim kodum.

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()

Ben bunu alıyorum.

Ben bunu alıyorum.

Ayrıca veri noktalarının üzerine yazma sorunum var. Herhangi biri bana bu problemde yardımcı olabilir mi?

Yanıtlar:


194

Kodunuzda birkaç sorun var.

Önce büyük olanlar:

  1. Yeni bir şekil ve döngü → put her tekrarında yeni eksenleri yaratıyor fig = plt.figureve ax = fig.add_subplot(1,1,1)döngünün dışına.

  2. Konumlandırıcıları kullanmayın. Fonksiyonları ax.set_xticks()ve ax.grid()doğru anahtar kelimelerle çağırın .

  3. Sizinle plt.axes()yeniden yeni eksenler yaratıyorsunuz. Kullanın ax.set_aspect('equal').

Küçük şeyler: MATLAB benzeri sözdizimini plt.axis()nesnel sözdizimi ile karıştırmamalısınız. Kullanımax.set_xlim(a,b) veax.set_ylim(a,b)

Bu, çalışan asgari bir örnek olmalıdır:

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()

Çıktı şudur:

sonuç


2
Cevabın için çok teşekkür ederim! Sorunlarımı çözdün! İşaretleri dışarıda ayarlamak için, ax.tick_params eklemem gerekiyordu (ki = 'her ikisi', yön = 'dışarı').
baykuş

33

MaxNoe'nun cevabına ince bir alternatif, burada tik işaretlerini açıkça belirlemiyorsunuz, bunun yerine kadansı belirliyorsunuz.

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=':')

Matplotlib Özel Izgara


Teşekkürler! Bu çok daha pratik.
M Ka
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.