y轴小刻度的bug

0 投票
2 回答
38 浏览
提问于 2025-04-13 21:09

在y轴上,次刻度线的位置不太对。我把次刻度的设置定为2,这样每两个主刻度之间应该有一个次刻度,但我发现y轴底部有刻度线,而中间和顶部却没有。

这是我的代码:

import numpy as np

import matplotlib.pyplot as plt

import pandas as pd

from matplotlib.ticker import (AutoMinorLocator)

from matplotlib.pyplot import figure

minor_locator = AutoMinorLocator(n=2)

#a je 2-->1

a_1_2 = np.array([0,12.3787177960363,0,12.3787177960363,0,0,0,13.4102776123727,0,0,0,13.4102776123727,0,10.3155981633636,0,10.3155981633636,0,14.441837428709,0,14.441837428709,0,15.4733972450454,0,15.4733972450454,0,13.4102776123727,0,20.6311963267272,0,20.6311963267272,0,0,0,18.5680766940545,0,18.5680766940545])

a_1_2[a_1_2==0] = np.nan

#b je 1-->2

b_1_2 = np.array([12.3787177960363,0,12.3787177960363,0,13.4102776123727,0,0,0,13.4102776123727,0,0,0,10.3155981633636,0,10.3155981633636,0,14.441837428709,0,14.441837428709,0,15.4733972450454,0,15.4733972450454,0,13.4102776123727,0,20.6311963267272,0,20.6311963267272,0,18.5680766940545,0,0,0,18.5680766940545,0])

b_1_2[b_1_2==0] = np.nan

#c je 2-->3

c = np.array([0,0,0,0,0,13.4102776123727,0,0,0,13.4102776123727,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18.5680766940545,0,0,0,0])

c[c==0] = np.nan

#d je 3-->2

d = np.array([0,0,0,0,0,0,13.4102776123727,0,0,0,13.4102776123727,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18.5680766940545,0,0,0])

d[d==0] = np.nan

vykon_1_2 = np.array([70,37,68,33,62,131,125,21,58,118,114,19,64,21,60,21,90,78,80,71,74,71,70,70,82,54,75,44,68,61,70,129,123,56,71,53])

a_1_04 = np.array([0,16.480541444427,0,16.480541444427,0,13.7337845370225,0,13.7337845370225,0,10.987027629618,0,10.987027629618,0,0,8.24027072221352,16.480541444427,0,0,15.1071629907248,0,15.1071629907248,0,19.2272983518315,0,12.3604060833203,0,9.61364917591577])

a_1_04[a_1_04==0] = np.nan

b_1_04 = np.array([16.480541444427,0,16.480541444427,0,16.480541444427,0,13.7337845370225,0,13.7337845370225,0,10.987027629618,0,10.987027629618,8.24027072221352,0,0,16.480541444427,15.1071629907248,0,15.1071629907248,0,19.2272983518315,0,12.3604060833203,0,9.61364917591577,0])

b_1_04[b_1_04==0] = np.nan

vykon_1_04 = np.array([80,44,65,44,67,36,78,36,79,60,79,61,80,99,90,54,70,85,39,85,39,72,67,102,48,128,127])

a_0_8 = np.array([0,27.8521150410817,0,27.8521150410817,0,32.4941342145953,0,32.4941342145953])

a_0_8[a_0_8==0] = np.nan

b_0_8 = np.array([27.8521150410817,0,27.8521150410817,0,32.4941342145953,0,32.4941342145953,0])

b_0_8[b_0_8==0] = np.nan

vykon_0_8 = np.array([105,100,101,97,97,95,98,94])

R_a_1_2 = 1.78*a_1_2*1.2e-3/(5.04e-5)

R_b_1_2 = 1.78*b_1_2*1.2e-3/(5.04e-5)

R_a_1_04 = 1.78*a_1_04*1.04e-3/(5.04e-5)

R_b_1_04 = 1.78*b_1_04*1.04e-3/(5.04e-5)

R_a_0_8 = 1.78*a_0_8*0.8e-3/(5.04e-5)

R_b_0_8 = 1.78*b_0_8*0.8e-3/(5.04e-5)

a_1_2 = pd.DataFrame(a_1_2)

b_1_2 = pd.DataFrame(b_1_2)

c = pd.DataFrame(c)

d = pd.DataFrame(d)

R_a_1_2 = pd.DataFrame(R_a_1_2)

R_b_1_2 = pd.DataFrame(R_b_1_2)

vykon_1_2 = pd.DataFrame(vykon_1_2)

a_1_04 = pd.DataFrame(a_1_04)

b_1_04 = pd.DataFrame(b_1_04)

R_a_1_04 = pd.DataFrame(R_a_1_04)

R_b_1_04 = pd.DataFrame(R_b_1_04)

vykon_1_04 = pd.DataFrame(vykon_1_04)

a_0_8 = pd.DataFrame(a_0_8)

b_0_8 = pd.DataFrame(b_0_8)

R_a_0_8 = pd.DataFrame(R_a_0_8)

R_b_0_8 = pd.DataFrame(R_b_0_8)

vykon_0_8 = pd.DataFrame(vykon_0_8)

data_1_2 = pd.concat([vykon_1_2, a_1_2,b_1_2,c,d], axis = 1)

data_1_04 = pd.concat([vykon_1_04, a_1_04,b_1_04], axis = 1)

data_0_8 = pd.concat([vykon_0_8, a_0_8,b_0_8], axis = 1)

data_R_1_2 = pd.concat([vykon_1_2, R_a_1_2,R_b_1_2,], axis = 1)

data_R_1_04 = pd.concat([vykon_1_04, R_a_1_04,R_b_1_04], axis = 1)

data_R_0_8 = pd.concat([vykon_0_8, R_a_0_8,R_b_0_8], axis = 1)

fig, ax = plt.subplots(figsize=(8,5), dpi = 100)

#figure(figsize=(8,5), dpi = 100)

#plt.plot(data.iloc[:,0],data.iloc[:,1],"v", color="#000000")

plt.ylabel('Výkon [W]')

plt.xlabel('Rychlost plynu [m/s]')

ax.plot(data_1_2.iloc[:,2],data_1_2.iloc[:,0],"v", color="#000000", label = "1,2 mm průměr")

ax.plot(data_1_04.iloc[:,2],data_1_04.iloc[:,0],"s", color="#ff0000", label = "1,04 mm průměr")

ax.plot(data_0_8.iloc[:,2],data_0_8.iloc[:,0],"o", color="#0000ff", label = "0,8 mm průměr")

ax.legend()

#plt.plot(data_1_2.iloc[:,2],data_1_2.iloc[:,0])

#plt.plot(data_1_2.iloc[:,3],data_1_2.iloc[:,0])

#plt.xlim(10, 140)

plt.yticks(np.arange(10,130+1, step=20))

ax.yaxis.set_minor_locator(minor_locator)

plt.xticks(np.arange(5, 35+1, step=2.5))

ax.xaxis.set_minor_locator(minor_locator)

plt.savefig("prechod_z_1_na_2.pdf")

#ax.xaxis.set_major_locator(MultipleLocator(20))

#ax.xaxis.set_minor_locator(MultipleLocator(5))

这是我得到的结果:

enter image description here

2 个回答

0
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from matplotlib.ticker import AutoMinorLocator

minor_locator = AutoMinorLocator(n=2)

# your data 
fig, ax = plt.subplots(figsize=(8,5), dpi=100)

plt.ylabel('Výkon [W]')
plt.xlabel('Rychlost plynu [m/s]')

ax.plot(data_1_2.iloc[:,2], data_1_2.iloc[:,0], "v", color="#000000", label="1,2 mm průměr")
ax.plot(data_1_04.iloc[:,2], data_1_04.iloc[:,0], "s", color="#ff0000", label="1,04 mm průměr")
ax.plot(data_0_8.iloc[:,2], data_0_8.iloc[:,0], "o", color="#0000ff", label="0,8 mm průměr")
ax.legend()

plt.yticks(np.arange(10, 130+1, step=20))
plt.xticks(np.arange(5, 35+1, step=2.5))

# minor tick placement on y-axis is adjusted here
ax.yaxis.set_minor_locator(minor_locator)
minor_ticks_y = np.arange(15, 130, 20)  # Define minor tick positions manually
ax.set_yticks(minor_ticks_y, minor=True)

plt.savefig("prechod_z_1_na_2.pdf")
plt.show()

在这段代码中,minor_ticks_y 被定义为一个数组,这个数组里存放的是我们希望在 y 轴上放置小刻度的位置。你可以根据需要来调整这个数组里的位置。接着,使用 ax.set_yticks() 来设置这些刻度,并指定 minor=True,表示这些是小刻度。你可以按照自己的想法来调整 minor_ticks_y 数组里的位置。

1

简而言之,记得使用 ax.*axis.set_minor_locator(AutoMinorLocator(n))


如果你用同一个 AutoMinorLocator 实例两次,就会出问题。

我猜测是这样的:

  1. 当一个 AutoMinorLocator 被绑定到一个坐标轴上时,它内部会记录一个刻度位置的列表。
  2. 如果你把同一个实例作为 minor_locator 绑定到两个坐标轴上,内部数据只会对最后一个坐标轴是正确的,因为之前的数据会被覆盖。
  3. 当你使用 plt.show() 时,只有一个坐标轴会关联到正确的数据结构(就是最后一个绑定的那个),而第一个坐标轴的刻度会根据第二个坐标轴的刻度位置来放置。

下面是一个例子。

在第一个子图中,先把同一个实例用在 x 轴上,然后用在 y 轴上,y 轴的刻度是正确的,但 x 轴的刻度却在 16.67 和 23.33,也就是和 y 轴的两个位置一样!
在第二个子图中,先用在 y 轴上,然后用在 x 轴上,x 轴的刻度是正确的,但 y 轴的刻度和 x 轴的刻度在同样的位置,最后一个 y 轴的刻度大约在 35。
在第三个子图中,使用两个不同的新实例,这样两个坐标轴的刻度都是正确的。

在这里输入图片描述

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import AutoMinorLocator

#Number of Minor Ticks
nmt = 3

b_1_2 = np.array([12.3787177960363,0,12.3787177960363,0,13.4102776123727,0,0,0,13.4102776123727,0,0,0,10.3155981633636,0,10.3155981633636,0,14.441837428709,0,14.441837428709,0,15.4733972450454,0,15.4733972450454,0,13.4102776123727,0,20.6311963267272,0,20.6311963267272,0,18.5680766940545,0,0,0,18.5680766940545,0])
b_1_04 = np.array([16.480541444427,0,16.480541444427,0,16.480541444427,0,13.7337845370225,0,13.7337845370225,0,10.987027629618,0,10.987027629618,8.24027072221352,0,0,16.480541444427,15.1071629907248,0,15.1071629907248,0,19.2272983518315,0,12.3604060833203,0,9.61364917591577,0])
b_0_8 = np.array([27.8521150410817,0,27.8521150410817,0,32.4941342145953,0,32.4941342145953,0])

vykon_1_2 = np.array([70,37,68,33,62,131,125,21,58,118,114,19,64,21,60,21,90,78,80,71,74,71,70,70,82,54,75,44,68,61,70,129,123,56,71,53])
vykon_1_04 = np.array([80,44,65,44,67,36,78,36,79,60,79,61,80,99,90,54,70,85,39,85,39,72,67,102,48,128,127])
vykon_0_8 = np.array([105,100,101,97,97,95,98,94])

for v in (b_1_2, b_1_04, b_0_8): v[v==0] = np.nan

fig, axes = plt.subplots(3, 1, figsize=(7, 10), layout='constrained')
for n, ax in enumerate(axes.flat):

  ax.plot( b_1_2,  vykon_1_2, "v", color="#000000", label = "1,20 mm průměr")
  ax.plot(b_1_04, vykon_1_04, "s", color="#ff0000", label = "1,04 mm průměr")
  ax.plot (b_0_8,  vykon_0_8, "o", color="#0000ff", label = "0,80 mm průměr")

  ax.set_xticks(np.arange(5, 35+1, step=2.5))
  ax.set_yticks(np.arange(10,130+1, step=20))
  minor_locator = AutoMinorLocator(nmt)
  if n==0:
    ax.xaxis.set_minor_locator(minor_locator)  
    ax.yaxis.set_minor_locator(minor_locator)
  elif n==1:
    ax.yaxis.set_minor_locator(minor_locator)
    ax.xaxis.set_minor_locator(minor_locator)
  else:
    ax.xaxis.set_minor_locator(AutoMinorLocator(nmt))
    ax.yaxis.set_minor_locator(AutoMinorLocator(nmt))
      
  ax.set_xlabel('Rychlost plynu [m/s]')
  ax.set_ylabel('Výkon [W]')
  ax.legend()

plt.show()

撰写回答