如何在图中显示带文本框的数组?

问题描述 投票:3回答:2

我正在尝试使用彩色文本框在MATLAB中将数组显示为数字,该文本框根据该位置的值而变化。

到目前为止,我已经尝试使用MATLAB编辑绘图工具绘制这样的图形,然后生成代码以查看它的外观。这是我想出的:

figure1=figure

annotation(figure1,'textbox',...
    [0.232125037302298 0.774079320113315 0.034810205908684 0.0410764872521246],...
    'String','HIT',...
    'FitBoxToText','off',...
    'BackgroundColor',[0.470588235294118 0.670588235294118 0.188235294117647]);

annotation(figure1,'textbox',...
    [0.27658937630558 0.774079320113315 0.034810205908684 0.0410764872521246],...
    'String',{'STAY'},...
    'FitBoxToText','off',...
    'BackgroundColor',[1 0 0]);

结果看起来不太好。我想要一些整洁而不难写的东西。在视觉上,我想要这样的事情:

enter image description here

arrays matlab textbox figure
2个回答
2
投票

我找到了使用pcolor function的可能解决方案。

警告:我只用Octave进行了测试

如果你想创建一个(m×n)表,根据你的图片,4色,你必须:

  • 创建一个大小为(m+1 x n+1)integers' in the1:4`范围的数组,根据所需的顺序设置它们
  • 打电话给pcolor来绘制表格
  • 调整figure的大小
  • 根据所需的颜色创建自己的colormap
  • 设置`colormap'
  • 使用text function添加所需的文本
  • 设置轴的tickticklabel

编辑以回答评论

在下文中,您可以找到建议的解决方案的可能实现。

代码创建两个figure

  • 在第一个中将绘制输入矩阵的值
  • 在第二个用户定义的字符串

关联“颜色 - 值”通过用户定义的色彩映射执行。

因为在矩阵x中有4种不同的可能值(它被定义为x=randi([1 4],n_row+1,n_col+1);),所以colormap必须由4 RGB条目组成,如下所示。

cm=[1 0.3 0.3   % RED
    0.3 0.3 1   % BLUE
    0   1   0   % GREEN
    1   1   1]; % WHITE

如果要更改关联,只需更改色彩映射行的顺序即可。

代码中的注释应阐明上述步骤。

代码已更新

% Define a rnadom data set
n_row=24;
n_col=10;
x=randi([1 4],n_row+1,n_col+1);

for fig_idx=1:2
   % Open two FIGURE
   % In the first one wil be ploted the values of the input matrix
   % In the second one the user defined strings
   figure('position',[ 1057    210    606    686])
   % Plot the matrix
   s=pcolor(x);
   set(s,'edgecolor','w','linewidth',3)
   % Define the colormap

   %cm=[1 1 1
   %    0 1 0
   %    0.3 0.3 1
   %    1 0.3 0.3];


   cm=[1 0.3 0.3   % RED
       0.3 0.3 1   % BLUE
       0   1   0   % GREEN
       1   1   1]; % WHITE

   % Set the colormap
   colormap(cm);
   % Write the text according to the color
   [r,c]=find(x(1:end-1,1:end-1) == 1);
   for i=1:length(r)
      if(fig_idx == 1)
         ht=text(c(i)+.1,r(i)+.5,num2str(x(r(i),c(i))));
      else
         ht=text(c(i)+.1,r(i)+.5,'SUR');
      end
      set(ht,'fontweight','bold','fontsize',10);
   end
   % Write the text according to the color
   [r,c]=find(x(1:end-1,1:end-1) == 2);
   for i=1:length(r)
      if(fig_idx == 1)
         ht=text(c(i)+.1,r(i)+.5,num2str(x(r(i),c(i))));
      else
         ht=text(c(i)+.1,r(i)+.5,'DBL');
      end
      set(ht,'fontweight','bold','fontsize',10);
   end
   % Write the text according to the color
   [r,c]=find(x(1:end-1,1:end-1) == 3);
   for i=1:length(r)
      if(fig_idx == 1)
         ht=text(c(i)+.1,r(i)+.5,num2str(x(r(i),c(i))));
      else
         ht=text(c(i)+.1,r(i)+.5,'HIT');
      end
      set(ht,'fontweight','bold','fontsize',10);
   end
   % Write the text according to the color
   [r,c]=find(x(1:end-1,1:end-1) == 4);
   for i=1:length(r)
      if(fig_idx == 1)
         ht=text(c(i)+.1,r(i)+.5,num2str(x(r(i),c(i))));
      else
         ht=text(c(i)+.1,r(i)+.5,'STK');
      end
      set(ht,'fontweight','bold','fontsize',10);
   end
   % Create and set the X labels
   xt=.5:10.5;
   xtl={' ';'2';'3';'4';'5';'6';'7';'8';'9';'10';'A'};
   set(gca,'xtick',xt);
   set(gca,'xticklabel',xtl,'xaxislocation','top','fontweight','bold');
   % Create and set the X labels
   yt=.5:24.5;
   ytl={' ';'Soft20';'Soft19';'Soft18';'Soft17';'Soft16';'Soft15';'Soft14';'Soft13'; ...
        '20';'19';'18';'17';'16';'15';'14';'13';'12';'11';'10';'9';'8';'7';'6';'5'};
   set(gca,'ytick',yt);
   set(gca,'yticklabel',ytl,'fontweight','bold');
   title('Dealer''s Card')
end

表格与输入矩阵中的值

enter image description here

表格包含用户定义的字符串

enter image description here


2
投票

这是一个受il_raffa的answer启发的答案,但也有不同的差异。没有更好或更坏,这只是一个偏好问题。

主要区别是:

  • 它使用imagesc而不是pcolor
  • 它使用第二个覆盖的axes来精确控制网格color/thickness/transparency等...
  • value - label - color之间的关联在一个表中就开始了。然后,所有代码都将尊重此表。

它是这样的:

%% Random data
n_row = 24;
n_col = 10;
vals = randi([1 4], n_row, n_col);

%% Define labels and associated colors
% this is your different labels and the color associated. There will be
% associated to the values 1,2,3, etc ... in the order they appear in this
% table:
Categories = {
    'SUR' , [1 0 0] % red       <= Label and color associated to value 1
    'DBL' , [0 0 1] % blue      <= Label and color associated to value 2
    'HIT' , [0 1 0] % green     <= Label and color associated to value 3
    'STK' , [1 1 1] % white     <= you know what this is by now ;-)
    } ;

% a few more settings
BgColor  = 'w' ; % Background color for various elements
strTitle = 'Dealer''s Card' ;

%% Parse settings
% get labels according to the "Categories" defined above
labels = Categories(:,1) ;
% build the colormap according to the "Categories" defined above
cmap = cell2mat( Categories(:,2) ) ;

%% Display
hfig = figure('Name',strTitle,'Color',BgColor,...
              'Toolbar','none','Menubar','none','NumberTitle','off') ;
ax1 = axes ;

imagesc(vals)     % Display each cell with an associated color
colormap(cmap);   % Set the colormap
grid(ax1,'off')   % Make sure there is no grid 

% Build and place the texts objects
textStrings = labels(vals) ;
[xl,yl]     = meshgrid(1:n_col,1:n_row);
hStrings    = text( xl(:), yl(:), textStrings(:), 'HorizontalAlignment','center');

%% Modify text color if needed
% (White text for the darker box colors)
textColors = repmat(vals(:) <= 2 ,1,3);
set(hStrings,{'Color'},num2cell(textColors,2));

%% Set the axis labels
xlabels = [ cellstr(num2str((2:10).')) ; {'A'} ] ;
ylabels = [ cellstr(num2str((5:20).')) ; cellstr(reshape(sprintf('soft %2d',[13:20]),7,[]).') ] ;

set(ax1,'XTick',        1:numel(xlabels), ...
        'XTickLabel',   xlabels, ...
        'YTick',        1:numel(ylabels), ...
        'YTickLabel',   ylabels, ... 
        'TickLength',   [0 0], ...
        'fontweight',   'bold' ,...
        'xaxislocation','top') ;

title(strTitle)

%% Prettify
ax2 = axes ; % create new axe and retrieve handle
% superpose the new axe on top, at the same position
set(ax2,'Position', get(ax1,'Position') );
% make it transparent (no color)
set(ax2,'Color','none')
% set the X and Y grid ticks and properties
set(ax2,'XLim',ax1.XLim , 'XTick',[0 ax1.XTick+0.5],'XTickLabel','' ,... 
        'YLim',ax1.YLim , 'YTick',[0 ax1.YTick+0.5],'YTickLabel','' ,...
        'GridColor',BgColor,'GridAlpha',1,'Linewidth',2,...
        'XColor',BgColor,'YColor',BgColor) ;
% Make sure the overlaid axes follow the underlying one
resizeAxe2 = @(s,e) set(ax2,'Position', get(ax1,'Position') );
hfig.SizeChangedFcn = resizeAxe2 ;

它产生了下图:enter image description here

当然,您可以用您喜欢的颜色替换颜色。我鼓励你使用ax2的网格设置来获得不同的效果,你也可以使用text对象的属性(使它们变粗,其他颜色等......)。玩得开心 !

© www.soinside.com 2019 - 2024. All rights reserved.