Same transparency with overlapping patches - matlab

I have a geometric figure with a complex shape. However, it can be split into several simpler subfigures. I need to plot them with some transparency, so I use patches. However, in the overlapping areas the color is too dark, as (of course) the patches overlap.
MWE
patch([0.1 0.45 0.45 0.1], [0.65 0.65 0.85 0.85], 'black', 'EdgeAlpha', 0)
patch([0.35 0.55 0.55 0.35], [0.4 0.4 0.8 0.8], 'black', 'EdgeAlpha', 0)
alpha(0.6)
How do I achieve a uniform opacity? I am open to other approaches different from patches.

You can combine the patches however for complex shapes this may be hard to accomplish.
x=[0.1 0.45 0.45 0.55 0.55 0.35 0.35 0.1];
y=[0.85 0.85 0.8 0.8 0.4 0.4 0.65 0.65];
patch(x,y,'k','FaceAlpha',0.6,'LineStyle','none')

Related

How to put a border around a tikz figure with tcbox?

The following code produces the figure I want but only when I remove the \tcbox. I'd like a border around the figure. What I have done below works with other tikz figures. The problem seems to be with the table data. Can anyone please advise?
\begin{figure}
\tcbox{
\begin{tikzpicture}
\begin{axis}[
legend pos=south east,
xlabel=Variable 1, % label x axis
ylabel=Variable 2, % label y axis
]
\addplot[
scatter, only marks,
scatter/classes={
a={mark=square*,blue},
b={mark=triangle*,red}
}
]
table[x=x,y=y,meta=label]{
x y label
0.1 0.35 a
0.2 0.4 a
0.25 0.35 a
0.3 0.4 a
0.3 0.35 a
0.4 0.3 a
0.45 0.3 a
0.4 0.4 a
0.6 0.7 b
0.65 0.55 b
0.65 0.55 b
0.7 0.6 b
0.75 0.65 b
0.8 0.75 b
0.9 0.6 b
0.7 0.6 b
0.5 0.7 b
0.5 0.55 b
0.6 0.8 b
};
\legend{}
\end{axis}
\end{tikzpicture}
}
\caption{CAP HERE}
\label{statsexample}
\end{figure}
The issue is with your row separator. You can use row sep=crcr instead:
\begin{figure}
\tcbox{
\begin{tikzpicture}
\begin{axis}[
legend pos=south east,
xlabel=Variable 1, % label x axis
ylabel=Variable 2, % label y axis
]
\addplot[
scatter, only marks,
scatter/classes={
a={mark=square*,blue},
b={mark=triangle*,red}
}
]
table[x=x,y=y,meta=label,row sep=crcr]{
x y label\\
0.1 0.35 a\\
0.2 0.4 a\\
0.25 0.35 a\\
0.3 0.4 a\\
0.3 0.35 a\\
0.4 0.3 a\\
0.45 0.3 a\\
0.4 0.4 a\\
0.6 0.7 b\\
0.65 0.55 b\\
0.65 0.55 b\\
0.7 0.6 b\\
0.75 0.65 b\\
0.8 0.75 b\\
0.9 0.6 b\\
0.7 0.6 b\\
0.5 0.7 b\\
0.5 0.55 b\\
0.6 0.8 b\\
};
\end{axis}
\end{tikzpicture}
}
\caption{CAP HERE}
\label{statsexample}
\end{figure}

How to select the average value from 3 matrices

I am new to MATLAB and I need help. I have 3 matrices (A, B, and C) and I want to create a new matrix average_ABC that contains average values.
A = [ 0.3 0.5 0.9
0.14 0.36 0.1
0.9 0.5 0.14]
B = [ 0.8 0.9 0.14
0.1 0.25 0.4
0.8 0.14 0.25]
C = [0.25 0.3 0.47
0.12 0.3 0.2
0.14 0.56 0.9]
The resulting matrix will be
average_matrix = [ 0.3 0.5 0.47
0.12 0.25 0.2
0.8 0.5 0.25]
Please, any suggestion, how can I do it?
You can first concatenate your matrices along the third dimension (using cat) and then compute whatever you want using the dim parameter that is available for most functions to specify that you want to perform that operation along the third dimension.
Also you've stated that you want the average (mean), but based on your example you actually want the median. Either way, we can compute them using this method.
data = cat(3, A, B, C);
% Compute the mean
mean(data, 3)
% 0.45 0.56667 0.50333
% 0.12 0.30333 0.23333
% 0.61333 0.4 0.43
% Compute the median (which seems to be what you actually want)
median(data, 3)
% 0.3 0.5 0.47
% 0.12 0.3 0.2
% 0.8 0.5 0.25
I hope this will work
average_matrix=(A+B+C)/3.;

Plotting surface in Octave results in non-uniform surface?

I'm trying to plot the attached data in octave. The 1st column is the X values, the 2nd is the Y value, and the last is the Z values.
I'm running this script:
xVec = reshape(mat(:,1),25,9);
yVec = reshape(mat(:,2),25,9);
zVec = reshape(mat(:,3),25,9);
surf(xVec,yVec,zVec);
axis([0.15 0.85 0.15 0.85]);
set(gca, 'XTick',0.20:0.05:0.80);
set(gca, 'YTick',0.20:0.05:0.80);
But I keep getting an uneven surface which is very hard to understand. Why is that? What am I missing?
The data:
0.15 0.15 40.802
0.15 0.2 40.673
0.15 0.25 40.526
0.15 0.3 40.83
0.15 0.35 40.862
0.15 0.4 40.652
0.15 0.45 40.924
0.15 0.5 40.774
0.15 0.55 41.088
0.15 0.6 40.749
0.15 0.65 41.099
0.15 0.7 41.753
0.15 0.75 41.607
0.15 0.8 41.911
0.15 0.85 41.537
0.2 0.15 39.809
0.2 0.2 39.884
0.2 0.25 40.595
0.2 0.3 40.497
0.2 0.35 40.863
0.2 0.4 41.325
0.2 0.45 40.916
0.2 0.5 40.431
0.2 0.55 40.583
0.2 0.6 40.858
0.2 0.65 40.548
0.2 0.7 41.668
0.2 0.75 41.863
0.2 0.8 41.499
0.2 0.85 41.903
0.25 0.15 39.894
0.25 0.2 39.686
0.25 0.25 40.227
0.25 0.3 40.625
0.25 0.35 40.572
0.25 0.4 41.034
0.25 0.45 40.828
0.25 0.5 40.802
0.25 0.55 40.196
0.25 0.6 40.493
0.25 0.65 41.265
0.25 0.7 40.963
0.25 0.75 41.023
0.25 0.8 41.396
0.25 0.85 41.596
0.3 0.15 39.546
0.3 0.2 40.216
0.3 0.25 39.535
0.3 0.3 39.945
0.3 0.35 40.108
0.3 0.4 40.726
0.3 0.45 40.187
0.3 0.5 41.279
0.3 0.55 40.747
0.3 0.6 41.122
0.3 0.65 40.91
0.3 0.7 40.292
0.3 0.75 41.04
0.3 0.8 41.287
0.3 0.85 42.023
0.35 0.15 38.693
0.35 0.2 40.269
0.35 0.25 40.561
0.35 0.3 40.536
0.35 0.35 40.268
0.35 0.4 39.947
0.35 0.45 40.259
0.35 0.5 40.146
0.35 0.55 41.048
0.35 0.6 40.263
0.35 0.65 40.875
0.35 0.7 41.281
0.35 0.75 40.836
0.35 0.8 41.322
0.35 0.85 41.734
0.4 0.15 39.321
0.4 0.2 39.103
0.4 0.25 39.694
0.4 0.3 40.529
0.4 0.35 40.272
0.4 0.4 39.826
0.4 0.45 40.224
0.4 0.5 40.808
0.4 0.55 40.66
0.4 0.6 40.003
0.4 0.65 41.626
0.4 0.7 41.549
0.4 0.75 41.523
0.4 0.8 41.408
0.4 0.85 41.545
0.45 0.15 39.428
0.45 0.2 39.53
0.45 0.25 39.988
0.45 0.3 40.039
0.45 0.35 40.075
0.45 0.4 40.206
0.45 0.45 40.946
0.45 0.5 41.027
0.45 0.55 41.214
0.45 0.6 40.98
0.45 0.65 40.874
0.45 0.7 41.483
0.45 0.75 41.151
0.45 0.8 41.123
0.45 0.85 40.528
0.5 0.15 39.477
0.5 0.2 39.62
0.5 0.25 40.265
0.5 0.3 39.61
0.5 0.35 40.109
0.5 0.4 40.232
0.5 0.45 40.212
0.5 0.5 40.861
0.5 0.55 39.665
0.5 0.6 41.225
0.5 0.65 40.577
0.5 0.7 40.62
0.5 0.75 41.244
0.5 0.8 40.977
0.5 0.85 41.753
0.55 0.15 39.033
0.55 0.2 39.769
0.55 0.25 40.164
0.55 0.3 40.351
0.55 0.35 40.592
0.55 0.4 40.227
0.55 0.45 40.14
0.55 0.5 40.734
0.55 0.55 40.429
0.55 0.6 40.701
0.55 0.65 40.849
0.55 0.7 40.596
0.55 0.75 41.481
0.55 0.8 41.27
0.55 0.85 40.755
0.6 0.15 38.944
0.6 0.2 39.76
0.6 0.25 39.051
0.6 0.3 40.009
0.6 0.35 39.84
0.6 0.4 40.072
0.6 0.45 41.282
0.6 0.5 40.606
0.6 0.55 40.98
0.6 0.6 41.141
0.6 0.65 40.111
0.6 0.7 41.627
0.6 0.75 41.798
0.6 0.8 41.196
0.6 0.85 41.35
0.65 0.15 39.457
0.65 0.2 39.38
0.65 0.25 40.26
0.65 0.3 40.142
0.65 0.35 39.935
0.65 0.4 40.496
0.65 0.45 39.862
0.65 0.5 40.665
0.65 0.55 40.187
0.65 0.6 40.955
0.65 0.65 39.834
0.65 0.7 40.641
0.65 0.75 41.162
0.65 0.8 41.028
0.65 0.85 41.54
0.7 0.15 38.938
0.7 0.2 39.803
0.7 0.25 39.485
0.7 0.3 39.8
0.7 0.35 39.459
0.7 0.4 39.895
0.7 0.45 40.203
0.7 0.5 40.222
0.7 0.55 40.176
0.7 0.6 41.01
0.7 0.65 41.433
0.7 0.7 41.651
0.7 0.75 41.018
0.7 0.8 41.185
0.7 0.85 41.216
0.75 0.15 39.182
0.75 0.2 38.856
0.75 0.25 39.992
0.75 0.3 40.005
0.75 0.35 39.613
0.75 0.4 39.526
0.75 0.45 40.232
0.75 0.5 40.45
0.75 0.55 41.157
0.75 0.6 40.578
0.75 0.65 41.106
0.75 0.7 41.252
0.75 0.75 40.773
0.75 0.8 41.207
0.75 0.85 42.219
0.8 0.15 39.33
0.8 0.2 39.463
0.8 0.25 39.435
0.8 0.3 40.252
0.8 0.35 39.819
0.8 0.4 39.826
0.8 0.45 40.506
0.8 0.5 41.031
0.8 0.55 40.666
0.8 0.6 41.306
0.8 0.65 40.674
0.8 0.7 41.489
0.8 0.75 40.956
0.8 0.8 41.61
0.8 0.85 41.099
0.85 0.15 39.247
0.85 0.2 38.983
0.85 0.25 39.051
0.85 0.3 39.098
0.85 0.35 39.617
0.85 0.4 40.541
0.85 0.45 40.091
0.85 0.5 40.435
0.85 0.55 40.55
0.85 0.6 40.204
0.85 0.65 40.682
0.85 0.7 40.965
0.85 0.75 41.063
0.85 0.8 41.113
0.85 0.85 41.577
Well, as far as I can see in your data X values change every 15 points, so do Y and Z.
It seems you are reshaping incorrectly.
Try the next really small changes to your code:
xVec = reshape(data(:,1),15,15);
yVec = reshape(data(:,2),15,15);
zVec = reshape(data(:,3),15,15);
surf(xVec,yVec,zVec);
axis([0.15 0.85 0.15 0.85]);
set(gca, 'XTick',0.20:0.05:0.80);
set(gca, 'YTick',0.20:0.05:0.80);
Output:
(This is only true for matlab, so I don't know if octav is any different, but I don't think so.)
The problem is that surf needs a very specific input format, it does not work with vectors.
the function you would want is griddata which interpolates any 3D or 4D input data on an even grid (which would be the needed input of surf).
It works somewhat like this:
xVec=mat(:,1);
yVec=mat(:,2);
zVec=mat(:,3);
gridpoints = 100;
[xi, yi] = meshgrid(linspace(min(xVec),max(xVec),gridpoints),linspace(min(xVec),max(xVec),gridpoints));
zi = griddata(xVec,yVec,zVec,xi,yi);
surf(xi,yi,zi);

Show only predefined value in axes MATLAB

I would like to only show these x-values on the x-axes
xx=[0.0005 0.005 0.05 0.1 0.25 0.5 0.75 1 1.25 1.5];
Is it possible?
You can modify axis labels using XtTickLabel property. For example:
set(gca,'XTickLabel',[0.0005 0.005 0.05 0.1 0.25 0.5 0.75 1 1.25 1.5])
This will change only labels, not actual values on the plot. To check values as well you can use:
set(gca,'XTick',[0.0005 0.005 0.05 0.1 0.25 0.5 0.75 1 1.25 1.5]);
set(gca,'XScale','log'); % Your xx values seem to be logarithmic, so this can help.

How to plot two stem plots and two box plots in one figure in MATLAB?

I have two vectors
A=[0.1 0.1 0.2 0.2 0.3 0.3 0.3 0.3 0.4 0.5 0.5]
B=[0.7 0.7 0.8 0.8 0.9 0.9 0.9 0.9 1 1 1]
How to plot their stem plots and box plots at the same time?
The y-axis should be the probability of the stem plots.
What I am looking for is something like this.
Drawing the box-plots can be accomplished with
boxplot([A B], [ones(size(A)) 2*ones(size(B))], ...
'orientation', 'horizontal', 'positions', [1 1]);
After which you can add the stem plots with
hold on
stem(xa, ya);
stem(xb, yb);
where I'm not sure exactly what you are asking for for x and y.