Как масштабировать ось Y на гистограмме по значениям x в R?

У меня есть некоторые данные, которые представляют размеры частиц. Я хочу отображать частоту каждого размера частиц в виде гистограммы, но масштабировать частоту, но размер частицы (поэтому она представляет общую массу при этом размере).

Я могу построить гистограмму в порядке, но я не уверен, как масштабировать ось Y по значению X каждого бина.

например если у меня есть 10 частиц в ячейке 40-60, я хочу, чтобы значение оси Y было 10 * 50 = 500.


person Nick    schedule 13.10.2010    source источник
comment
Я бы создал пользовательскую переменную, которая будет хранить значения масштаба, и использовать ее для создания гистограммы.   -  person Roman Luštrik    schedule 13.10.2010
comment
Общая масса — это понятие объема (т. е. количество*размер). И вы пытаетесь представить это в одном измерении высотами гистограммы. Мой ответ ниже, считает высоту столбцов, но масштабирует ширину по размеру. Таким образом, вы получаете общую массу, представленную площадью мусорных ведер. Ваш объект больше не является гистограммой, и людям будет трудно ее интерпретировать. Если вам все еще нужен исходный объект, просто рассчитайте общую массу и начертите график с помощью гистограммы, как предложил Роман.   -  person VitoshKa    schedule 13.10.2010
comment
Общая масса при заданном размере - это то, что необходимо нанести на график, чтобы его можно было сравнить с выходом хроматографической машины, где абсорбция пропорциональна общей массе вещества, прошедшего через частицу определенной массы. Это, конечно, менее интуитивно понятно, но более актуально!   -  person Nick    schedule 13.10.2010
comment
Это действительное количество для построения графика. Использование столбцов для его представления несколько вводит в заблуждение, поскольку площадь каждого столбца не имеет значения. Точечная диаграмма — идеальный кандидат для вашего случая. Я обновил свой ответ.   -  person VitoshKa    schedule 14.10.2010


Ответы (3)


Вам лучше использовать гистограмму, чтобы представить общую массу площадью бункеров (т.е. высота дает счет, ширина дает массу):

sizes <- 3:10   #your sizes    
part.type <- sample(sizes, 1000, replace = T)  #your particle sizes  

count <- table(part.type)  
barplot(count, width = size)  

Если у вас разные размеры частиц, вы должны сначала разрезать диапазон на соответствующее количество интервалов, чтобы создать коэффициент part.type:

part <- rchisq(1000, 10)  
part.type <- cut(part, 4)  

count <- table(part.type)  
barplot(count, width = size)  

Если интерес представляет только общая масса. Тогда подходящим графиком является точечная диаграмма. Это также намного нагляднее по сравнению с гистограммой для большого количества размеров:

part <- rchisq(1000, 10)
part.type <- cut(part, 20)

count <- table(part.type)
dotchart(count)

Представление общей массы с помощью контейнеров может ввести в заблуждение, поскольку площадь контейнеров не имеет смысла.

person VitoshKa    schedule 13.10.2010
comment
В MASS есть функция truehist, которая делает области бинов значимыми. - person IRTFM; 30.10.2013

если вы действительно хотите использовать среднюю точку каждого бина в качестве коэффициента масштабирования:

d<-rgamma(100,5,1.5) # sample
z<-hist(d,plot=FALSE) # make histogram, i.e., divide into bins and count up
co<-z$counts # original counts of each bin
z$counts<-z$counts*z$mids # scaled by mids of the bin

plot(z, xlim=c(0,10),ylim=c(0,max(z$counts))) # plot scaled histogram
par(new=T)
plot(z$mids,co,col=2,  xlim=c(0,10),ylim=c(0,max(z$counts))) # overplot original counts

вместо этого, если вы хотите использовать фактическое значение каждой точки выборки в качестве коэффициента масштабирования:

d<-rgamma(100,5,1.5)
z<-hist(d,plot=FALSE)
co<-z$counts # original counts of each bin
z$counts<-aggregate(d,list(cut(d,z$breaks)),sum)$x # sum up the value of data in each bin

plot(z, xlim=c(0,10),ylim=c(0,max(z$counts))) # plot scaled histogram
par(new=T)
plot(z$mids,co,col=2,  xlim=c(0,10),ylim=c(0,max(z$counts))) # overplot original counts
person kohske    schedule 13.10.2010

Просто скройте оси и перерисуйте их по мере необходимости.

# Generate some dummy data
datapoints <- runif(10000, 0, 100)

par (mfrow = c(2,2))

# We will plot 4 histograms, with different bin size
binsize <- c(1, 5, 10, 20)

for (bs in binsize)
    {
    # Plot the histogram. Hide the axes by setting axes=FALSE
    h <- hist(datapoints, seq(0, 100, bs), col="black", axes=FALSE, 
        xlab="", ylab="", main=paste("Bin size: ", bs))
    # Plot the x axis without modifying it
    axis(1)
    # This will NOT plot the axis (lty=0, labels=FALSE), but it will return the tick values
    yax <- axis(2, lty=0, labels=FALSE)
    # Plot the axis by appropriately scaling the tick values
    axis(2, at=yax, labels=yax/bs)
    }
person nico    schedule 13.10.2010