Stream: helpdesk (published)

Topic: won't plot x values for histogram


view this post on Zulip Yuu Yin (Mar 26 2023 at 17:01):

I have

using Plots

classIntervals = range(start=1, step=2, stop=20)
frequencyAbsolute::AbstractVector = [1; 1; 11; 21; 25; 17; 9; 4; 1]
frequencyAbsoluteCumulative = sum(frequencyAbsolute)
frequencyRelative::AbstractVector = (frequencyAbsolute ./ frequencyAbsoluteCumulative)

histogram(x=frequencyRelative, bins=classIntervals, label="Experimental", color=:gray, normalize=:pdf)
xlims!(1, 19)
ylims!(0, 30)
xlabel!("x")
plotHistogram = ylabel!("P(x)")

savefig(plotHistogram, "out/plot-histogram.svg")

what is wrong with it that the x bars won't show up? i'm adapted example from https://docs.juliaplots.org/latest/series_types/histogram/

view this post on Zulip Daniel González (Mar 26 2023 at 17:12):

Not an expert on Plots, but it seems to me that the histogram function expects as x the actual values of the samples, not the binned counts (it will do that automatically, I guess). Since you're giving it a vector that is less than 1, it won't show up in bins that start at 1.

view this post on Zulip Daniel González (Mar 26 2023 at 17:15):

By the way, I believe annotating the vector as AbstractVector does not do anything beyond erroring out if the right hand side of the assignment is not a subtype of AbstractVector

view this post on Zulip Yuu Yin (Mar 26 2023 at 18:27):

@Daniel González thanks for the reply!

expects as x the actual values of the samples, not the binned counts (it will do that automatically, I guess).

do you mean the data set variable values, instead of any pre-processed frequency, right?

so i tried this

using Plots

x::AbstractVector = [
    02.97; 04.00; 05.20; 05.56; 05.94; 05.98; 06.35; 06.62; 06.72; 06.78;
    06.80; 06.85; 06.94; 07.15; 07.16; 07.23; 07.29; 07.62; 07.62; 07.69;
    07.73; 07.87; 07.93; 08.00; 08.26; 08.29; 08.37; 08.47; 08.54; 08.58;
    08.61; 08.67; 08.69; 08.81; 09.07; 09.27; 09.37; 09.43; 09.52; 09.58;
    09.60; 09.76; 09.82; 09.83; 09.83; 09.84; 09.96; 10.04; 10.21; 10.28;
    10.28; 10.30; 10.35; 10.36; 10.40; 10.49; 10.50; 10.64; 10.95; 11.09;
    11.12; 11.21; 11.29; 11.43; 11.62; 11.70; 11.70; 12.16; 12.19; 12.28;
    12.31; 12.62; 12.69; 12.71; 12.91; 12.92; 13.11; 13.38; 13.42; 13.43;
    13.47; 13.60; 13.96; 14.24; 14.35; 15.12; 15.24; 16.06; 16.90; 18.26;
]
classIntervals = range(start=1, step=2, length=19)

histogram(x=x, bins=classIntervals, label="Experimental", color=:gray, normalize=:pdf)
xlims!(1, 19)
ylims!(0, 30)
xlabel!("x")
plotHistogram = ylabel!("P(x)")

savefig(plotHistogram, "out/plot-histogram.svg")

but i have same issue

Since you're giving it a vector that is less than 1

what do you mean by that?

view this post on Zulip Daniel González (Mar 26 2023 at 18:32):

That works for me, but ylims! squeezes the plot (since the maximum frequency is <0.15). Regarding my previous comment, I meant that all the entries of the relative frequency vector are smaller than 1.0; therefore, since they are interpreted as samples, do not enter into any bin (the first bin is from 1 to 3 in your example)

view this post on Zulip Daniel González (Mar 26 2023 at 18:36):

Oh, I think for some reason it works if you do

histogram(x, bins=classIntervals, label="Experimental", color=:gray, normalize=:pdf)

but not if you do

histogram(x=x, bins=classIntervals, label="Experimental", color=:gray, normalize=:pdf)

view this post on Zulip Daniel González (Mar 26 2023 at 18:41):

Looking at the examples and documentation, it seems that histogram takes the data as the first positional argument, not as a keyword argument x.


Last updated: Oct 02 2023 at 04:34 UTC