programing

매트플롯 리브 임쇼() 그래프 축의 값 변경

newstyles 2023. 9. 6. 21:53

매트플롯 리브 임쇼() 그래프 축의 값 변경

입력 데이터가 있다고 가정합니다.

data = np.random.normal(loc=100, scale=10, size=(500,1,32))
hist = np.ones((32, 20)) # initialise hist
for z in range(32):
    hist[z], edges = np.histogram(data[:, 0, z], bins=np.arange(80, 122, 2))

다음을 이용해서 플롯을 할 수 있습니다.imshow():

plt.imshow(hist, cmap='Reds')

가져오기:

first try

그러나 x축 값이 입력 데이터와 일치하지 않습니다(즉, 평균 100, 범위는 80 ~ 122).하여 x의을자다서을ne자w서ee-여ox을의,oxedie을edges.

시도해 본 결과:

ax = plt.gca()
ax.set_xlabel([80,122]) # range of values in edges
...
# this shifts the plot so that nothing is visible

그리고.

ax.set_xticklabels(edges)
...
# this labels the axis but does not centre around the mean:

second try

제가 사용하고 있는 입력 데이터를 반영하여 축 값을 변경할 수 있는 방법에 대한 아이디어가 있습니까?

나는 그들이 그들을 변화시키는 것을 피하려고 노력할 것입니다.xticklabels가능한 경우, 그렇지 않으면 히스토그램에 추가 데이터가 과점도 표시되면 매우 혼란스러워질 수 있습니다.

를 정의하는 가장 의 를 이 입니다 하는 입니다 의 를 하는 imshow그것은 추가함으로써 이루어질 수 있습니다.extent 하면 자동으로 됩니다.이렇게 하면 축이 자동으로 조정됩니다.만약 당신이 사용할 라벨을 바꾸고 싶다면 나는set_xticks아마도 약간의 형식을 갖추었을 것입니다.라벨을 직접 바꾸는 것이 최후의 수단이 되어야 합니다.

fig, ax = plt.subplots(figsize=(6,6))

ax.imshow(hist, cmap=plt.cm.Reds, interpolation='none', extent=[80,120,32,0])
ax.set_aspect(2) # you may also use am.imshow(..., aspect="auto") to restore the aspect ratio

enter image description here

저도 비슷한 문제가 있었는데 구글에서 이 게시물로 보내주고 있었습니다.제 솔루션은 조금 다르고 덜 압축적이었지만, 누군가에게 유용할 수 있기를 바랍니다.

매트플롯 립으로 이미지를 보여줍니다.pyplot.imshow는 일반적으로 2D 데이터를 빠르게 표시하는 방법입니다.그러나 기본적으로 축에 픽셀 개수로 레이블을 지정합니다.그림을 그리려는 2D 데이터가 배열 x와 y로 정의된 균일한 그리드에 해당하는 경우 매트플롯리브를 사용할 수 있습니다.파이 플롯xticks 및 matplotlib.파이 플롯y는 배열에 있는 값을 사용하여 x 및 y 축에 레이블을 지정합니다.이러한 레이블은 실제 그리드 데이터에 해당하는 일부 레이블을 축의 픽셀 개수와 연결합니다.그리고 이것을 하는 것은 예를 들어 pcolor와 같은 것을 사용하는 것보다 훨씬 빠릅니다.

다음은 데이터에 대한 시도입니다.

import matplotlib.pyplot as plt

# ... define 2D array hist as you did

plt.imshow(hist, cmap='Reds')
x = np.arange(80,122,2) # the grid to which your data corresponds
nx = x.shape[0]
no_labels = 7 # how many labels to see on axis x
step_x = int(nx / (no_labels - 1)) # step between consecutive labels
x_positions = np.arange(0,nx,step_x) # pixel count at label position
x_labels = x[::step_x] # labels you want to see
plt.xticks(x_positions, x_labels)
# in principle you can do the same for y, but it is not necessary in your case

extent=는 일부 목록으로 설정되며, 이미지는 상자를 채우기 위해 x 및 y 방향을 따라 개별적으로 늘어납니다.을은로더다는(다o더)이t로lstoe는,)srtg'o만ktlsy은(ax.set아니면plt.xticks/plt.yticks:

fig, ax = plt.subplots(figsize=(6,6))
ax.imshow(hist, cmap='Reds', interpolation='none', extent=[80, 120, 32, 0], aspect=2)
ax.set(xticks=np.arange(80, 122)[::10], xticklabels=np.arange(80, 122)[::10]);

extent=이미지 크기를 설정합니다. 이를 사용하여 눈금 레이블을 설정하는 것이 이상적이지 않을 수도 있습니다.예를 들어, 다음과 같이 비교적 키가 크지만 작은 눈금 레이블이 있는 이미지를 표시하려고 합니다.

correct output

그리고나서,

fig, ax = plt.subplots(1, figsize=(6, 6))
ax.imshow(np.arange(120)[None, :], cmap='Reds', extent=[0, 120, 1, 0]);

생산품

wrong output

그렇지만

fig, ax = plt.subplots(1, figsize=(6, 6))
ax.imshow(np.arange(120)[None, :], cmap='Reds', extent=[0, 120, 10, 0]);
ax.set(xticks=np.linspace(0, 120, 7), xticklabels=np.arange(0, 121, 20), yticks=[0, 10], yticklabels=[0, 1]);

올바른 출력을 생성합니다.그 이유는extent=이미지가 원하는 레이블을 갖도록 큰 값으로 설정되었지만 눈금 레이블은 작은 값으로 설정되었습니다.

N.B.ax.get_xticks()그리고.ax.get_yticks()기본 눈금 위치를 이해하는 데 유용한 방법입니다.ax.get_xlim()그리고.ax.get_ylim()축 한계를 이해하는 데 유용한 방법입니다.


OP가 사용하는 방법에서도, 전혀 사용하지 않습니다.extent=,ax.get_xlim()돌아온다(-1.0, 19.5). x-tick 위치 범위가 이미 설정되어 있으므로 x-tick 레이블을 다른 값으로 설정하는 데 사용할 수 있습니다. 단순히 xtick을 이 범위 내의 일부 값으로 설정하고 xtick 레이블에 모든 값을 할당하면 됩니다.따라서 다음은 원하는 이미지를 렌더링합니다.

fig, ax = plt.subplots(figsize=(6,6))
ax.imshow(hist, cmap='Reds', interpolation='none', aspect=2)
ax.set(xticks=np.arange(-1, 20, 5), xticklabels=np.arange(80, 122, 10));

언급URL : https://stackoverflow.com/questions/18696122/change-values-on-matplotlib-imshow-graph-axis