문제

BAR3 플롯 명령으로 생성 한 2D 히스토그램 (플롯은 3D- 여러 히스토그램 그래프 나란히 그래프)을 가지고 있습니다. 그러나 모든 제로 값은 XY 평면에서 평평한 사각형으로 나타납니다. Matlab이 값을 표시하지 못하게하는 방법이 있습니까? 나는 이미 모든 0을 Nans로 교체하려고 시도했지만 음모에 대해 아무것도 바꾸지 않았습니다. 내가 실험 한 코드는 다음과 같습니다.

x1=normrnd(50,15,100,1); %generate random data to test code
x2=normrnd(40,13,100,1);
x3=normrnd(65,12,100,1);

low=min([x1;x2;x3]);
high=max([x1;x2;x3]);
y=linspace(low,high,(high-low)/4); %establish consistent bins for histogram
z1=hist(x1,y);
z2=hist(x2,y);
z3=hist(x3,y);
z=[z1;z2;z3]';
bar3(z)

보시다시피, 플롯에는 값이 거의 없습니다. 0을 닫고 0을 Nans로 교체 한 후 그림을 닫고 다시 플로팅하는 것 같습니다.

close
z(z==0)=NaN;
bar3(z)
도움이 되었습니까?

해결책

한 가지 해결책은 bar3. 먼저, 당신은 핸들을 반환해야합니다. bar3:

h = bar3(z);

당신의 경우, h 각 컬러 바 세트마다 하나의 핸들의 3 요소 벡터가됩니다. 그런 다음 다음 코드는 보이지 않는 카운트가있는 빈을 만들어야합니다.

for i = 1:numel(h)
  index = logical(kron(z(:, i) == 0, ones(6, 1)));
  zData = get(h(i), 'ZData');
  zData(index, :) = nan;
  set(h(i), 'ZData', zData);
end

그리고 여기에 그림이 있습니다 (의무적 인 자유 직접 서클 포함) :

enter image description here

작동 방식 ...

빈 카운트 벡터 인 경우 N-by-1, 그 다음에 bar3 줄거리 6*N 직사각형 패치 (즉, 각 쓰레기통에 대한 cuboid의 6면). 그만큼 'ZData' 각 패치 객체 세트에 대한 속성 h 그러므로 (6*N)-by-4, 각 직사각형면에 4 개의 모서리가 있기 때문에. 6 줄의 각 클러스터 'ZData' 그러므로 속성은 하나의 빈의 6면에 대한 z 코디네이션 세트입니다.

위의 코드는 먼저 빈 카운트가 0과 같은 곳 어디에서나 논리적 벡터를 만듭니다. 그런 다음이 벡터의 각 요소를 6 번 사용합니다. kron 기능. 이것은 행의 행에 대한 색인이됩니다 'ZData' 속성 및이 색인 nan 빈 쓰레기통의 패치. 패치가 렌더링되지 않습니다.


편집하다:

다음은 약간 수정 된 코드의 버전이 있습니다. 'ZData' 재산 플로팅 된 막대 중에서, 그것이 작동하는 데 필요한 것은 모두 반환 된 핸들입니다. bar3. 또한 함수에 코드를 래빙했습니다 (SANS 오류 및 입력 확인) :

function remove_empty_bars(hBars)
  for iSeries = 1:numel(hBars)
    zData = get(hBars(iSeries), 'ZData');  % Get the z data
    index = logical(kron(zData(2:6:end, 2) == 0, ones(6, 1)));  % Find empty bars
    zData(index, :) = nan;                 % Set the z data for empty bars to nan
    set(hBars(iSeries), 'ZData', zData);   % Update the graphics objects
  end
end

다른 팁

다음은 값이없는 막대를 숨기는 방법을 보여주는 예입니다. 우리는 정상으로 시작합니다 Bar3 구성:

x = 1:7;
Y = jet(numel(x));
h = bar3(x,Y,'detached');
xlabel x; ylabel y; zlabel z; box on;

before

변수입니다 h 배열이 포함되어 있습니다 surface 핸들 (이 경우 3 개, 막대의 각 "그룹"마다 하나씩. 그룹은의 열에 해당합니다. Y 매트릭스, 각각 다른 색상으로 표시).

그리고 이제 0 값을 숨기는 코드 :

for i=1:numel(h)
    %# get the ZData matrix of the current group
    Z = get(h(i), 'ZData');

    %# row-indices of Z matrix. Columns correspond to each rectangular bar
    rowsInd = reshape(1:size(Z,1), 6,[]);

    %# find bars with zero height
    barsIdx = all([Z(2:6:end,2:3) Z(3:6:end,2:3)]==0, 2);

    %# replace their values with NaN for those bars
    Z(rowsInd(:,barsIdx),:) = NaN;

    %# update the ZData
    set(h(i), 'ZData',Z)
end

after

설명:

각 막대 그룹에 대해 a surface 그래픽 객체가 생성됩니다 (손잡이가 저장되어 있습니다 h(i)). Z 코디네스 매트릭스입니다 ZData a로 표시됩니다 6*N-by-4 매트릭스 (동일 XData, YData, 그리고 CData 매트릭스), 여기서 N은 각 그룹의 직사각형 막대의 수, 위의 예제에서 7입니다.

이런 식으로 각 사각형은 6x4 행렬 (각각 x/y/z 좌표마다 하나씩)으로 표시됩니다. 예를 들어, 그러한 사각형의 좌표는 다음과 같습니다.

>> xx = get(h(3),'XData'); yy = get(h(3),'YData'); zz = get(h(3),'ZData');

>> xx(1:6,:)
ans =
          NaN          2.6          3.4          NaN
          2.6          2.6          3.4          3.4
          2.6          2.6          3.4          3.4
          NaN          2.6          3.4          NaN
          NaN          2.6          3.4          NaN
          NaN          NaN          NaN          NaN

>> yy(1:6,:)
ans =
          NaN          0.6          0.6          NaN
          0.6          0.6          0.6          0.6
          1.4          1.4          1.4          1.4
          NaN          1.4          1.4          NaN
          NaN          0.6          0.6          NaN
          NaN          NaN          NaN          NaN

>> zz(1:6,:)
ans =
          NaN            0            0          NaN
            0            1            1            0
            0            1            1            0
          NaN            0            0          NaN
          NaN            0            0          NaN
          NaN          NaN          NaN          NaN

각각의 두 번째 열은 왼쪽면을 따라 점을 추적하고, 세 번째 열은 오른쪽면을 따라 점을 추적하며, 두 개가 연결되면 사각형의 4면을 그립니다.

>> surface(xx(1:6,2:3), yy(1:6,2:3), zz(1:6,2:3), cc(1:6,2:3))
>> view(3)

rectangle_surface

첫 번째 및 마지막 열은 사각형의 측면을 닫아 남은 두면을 그립니다.

이러한 모든 매트릭스는 하나의 키 큰 행렬로 연결되며 직사각형은 모두 단일 표면 물체를 사용하여 그려집니다. 이것은 사용하여 달성됩니다 NaN 동일한 사각형의 지점 내부와 차이 사각형 사이의 다른 부분을 분리하는 값.

위의 코드가하는 일은 z- 높이가 0 인 사각형을 찾아 모든 값을 대체하는 것입니다. NaN Matlab에게 효과적으로 지시하는 값은 해당 지점에 의해 형성된 표면을 그립니다.

내 문제는 값이 0이 아니라 NAN 값 (BAR3 내부의 0 값으로 변환)이었습니다. 값이 0 인 요소를 계속 표시하고 싶지만 NAN 값의 요소는 아닙니다. 코드를 약간 조정했는데 완벽하게 작동했습니다.

for i = 1:numel(h)
  index = logical(kron(isnan(z(:,i)),ones(6,1)));
  zData = get(h(i),'ZData');
  zData(index,:) = nan;
  set(h(i),'ZData',zData);
end

감사!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top