Целочисленные значения для plt.xticks в Python - PullRequest
1 голос
/ 24 апреля 2020

Я хочу построить фигуру, и я установил plt.xticks как np.linspace (1, 3, 10).

Я думал, что значения на оси x будут 1, 1,2, 1.4, 1.6, ..., 3.

Но получилось: 1.000, 1.222, 1.444, 1.667, ..., 3.000.

Как это исправить?

import numpy as np
import matplotlib.pyplot as plt

n_c = 1
n_s = np.linspace(1, 3, 100)

iso_trapping_efficiency = (np.sqrt(1 - (n_c ** 2 / n_s ** 2))) *100

plt.figure()
plt.plot(n_s, iso_trapping_efficiency, 'r', label='Isotropic Dipole')

plt.xlabel('Refractive Index, n_s', fontsize=15)
plt.ylabel('Trapping Efficiency [%]', fontsize=15)

# change the xticks
plt.xticks(np.linspace(1, 3, 10))

plt.legend(loc='lower right')

plt.show()

enter image description here

Ответы [ 4 ]

1 голос
/ 24 апреля 2020

Я думаю, что у matplotlib есть несколько полезных методов для этого. Вы можете попробовать это:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker # new line

n_c = 1
n_s = np.linspace(1, 3, 100)

iso_trapping_efficiency = (np.sqrt(1 - (n_c ** 2 / n_s ** 2))) *100

plt.figure()
plt.plot(n_s, iso_trapping_efficiency, 'r', label='Isotropic Dipole')

plt.xlabel('Refractive Index, n_s', fontsize=15)
plt.ylabel('Trapping Efficiency [%]', fontsize=15)

# change the xticks
plt.xticks(np.linspace(1, 3, 10))

ax = plt.gca() # get current axis
ax.xaxis.set_major_locator(ticker.MultipleLocator(1.00)) # define a major locator to the ticker
ax.xaxis.set_minor_locator(ticker.MultipleLocator(0.25)) # set minor locators, w/o labels

plt.legend(loc='lower right')

plt.show()

Документация по mpl очень хорошая, она заполнена примерами, вы можете проверить ее здесь: https://matplotlib.org/3.1.1/gallery/ticks_and_spines/tick-formatters.html

Вот результат кода:

enter image description here

1 голос
/ 24 апреля 2020

np.linspace(1, 3, 10) создает 10 выборок (границ интервала) в интервале (1,3). Обратите внимание, что он включает начало и конец интервала в выборках. Следовательно, 10 выборок границ интервалов создадут 10-1 = 9 интервалов (представьте, что один интервал имеет две границы). Если вам нужно разделить его на 10 интервалов, позвоните np.linspace для 10 + 1 выборок:

 np.linspace(1, 3, 11)
1 голос
/ 24 апреля 2020

Третий параметр np.linspace() не включает значение. Попробуйте plt.xticks(np.linspace(1, 3, 11))

0 голосов
/ 24 апреля 2020

Python имеет точность по умолчанию для переменных с плавающей запятой. Вам нужно округлить только одну переменную.

plt.xticks(np.linspace(1, 3, 10).round(2))

Простое добавление второго раунда решает проблему

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...