2017-02-23 19 views
0

我正在使用ggplot2繪製大量數據框中的某些光譜數據。我想將圖形限制在400至900納米之間的波長。我知道如何使用scale_x_continuous()或xlim()來設置x軸限制。問題在於,在完成此操作後,y軸不會自動重新調整爲顯示的最小/最大值。我不想手動設置它,因爲我的循環處理的每個數據幀將具有不同的範圍。如何在R中限制X軸後自動重新計算y軸刻度ggplot2

哪裏summary是我的數據幀的列表中,那麼這段代碼給我地塊的名單,而軸調整:

plotlist <- list() 
for(i in 1:length(summary)){ 
    plotlist[[length(plotlist)+1]] <- ggplot(summary[[i]], aes(Wavelength, average)) + 
    geom_line(aes(color=Sample)) + 
    geom_linerange(aes(ymin=average-sem, ymax=average+sem, color=Sample), alpha=0.5) + 
    ylab("Absorbance (AU)") + ggtitle(names(summary)[i]) + 
    theme_classic() 
} 
plotlist[[33]] 

這給了我: Plot without axis adjustment

如果我調整X軸向400 - 900這樣:

plotlist <- list() 
for(i in 1:length(summary)){ 
    plotlist[[length(plotlist)+1]] <- ggplot(summary[[i]], aes(Wavelength, average)) + 
    scale_x_continuous(name="Wavelength (nm)", limits=c(400, 900), expand=c(0,0)) + 
    geom_line(aes(color=Sample), na.rm=TRUE) + 
    geom_linerange(aes(ymin=average-sem, ymax=average+sem, color=Sample), alpha=0.5, na.rm=TRUE) + 
    ylab("Absorbance (AU)") + ggtitle(names(summary)[i]) + 
    theme_classic() 
} 
plotlist[[33]] 

然後我得到這個情節,與x軸正確,但y軸的規模對於顯示的數據來說現在太大了: Plot with correct x-axis, but wrong y-axis

我該如何自動調整y軸到合適的最小/最大值,但只能在x軸的400-900 nm範圍內?

+0

編輯:我試圖改變我添加的比例,幾何等的順序,但這沒有什麼區別。 – beanstalker

回答

1

這是一個可能的解決方案。但是,由於我無法訪問您的數據,因此我無法測試它是否真正起作用。

您可以在構建繪圖之前定義波長範圍的最大平均值,然後在ylim函數中調用該值。

這兩條線我補充如下:

y_scale <- max(summary[[i]]$average[summary[[i]]$Wavelength >= 400 & summary[[i]]$Wavelength <= 900]) 

,並

ylim(0, (y_scale + 0.5))+ 

然後最終的代碼如下所示:

plotlist <- list() 
for(i in 1:length(summary)){ 
    y_scale <- max(summary[[i]]$average[summary[[i]]$Wavelength >= 400 & summary[[i]]$Wavelength <= 900]) 
    plotlist[[length(plotlist)+1]] <- ggplot(summary[[i]], aes(Wavelength, average)) + 
    scale_x_continuous(name="Wavelength (nm)", limits=c(400, 900), expand=c(0,0)) + 
    ylim(0, (y_scale + 0.5))+ 
    geom_line(aes(color=Sample), na.rm=TRUE) + 
    geom_linerange(aes(ymin=average-sem, ymax=average+sem, color=Sample), alpha=0.5, na.rm=TRUE) + 
    ylab("Absorbance (AU)") + ggtitle(names(summary)[i]) + 
    theme_classic() 
} 
plotlist[[33]] 

希望這有助於!

+0

除此之外,還有一個ggplot擴展處理繪圖譜。我從來沒有用過它,所以我不能說我會如何幫助解決這個問題,但它可能是值得研究的。 https://bitbucket.org/aphalo/ggspectra – tbradley

+0

非常感謝tbradley,這是一個很好的解決方案,但我得到了一個「彙總錯誤[[i]] $ average [summary [[i]]]:無效的下標類型列表「」。 我正在嘗試做類似的事情,但我無法弄清楚如何將平均y值分類到400-900倍範圍內的值。 – beanstalker

+0

我會檢查出光譜包,謝謝你的鏈接! – beanstalker