Stacked barplot for single cell analysis I want to create a stacked bar-graph with different cell cycles for each cell type within each condition. I have uploaded the file for it. Don't know how to go about it as now I have another condition (cell cycle). I was able to do the bar graph comparing cell cycle per condition but now I want to compare cell type and cell cycle in each condition

output of dput(head(all.combined@metadata))

structure(list(orig.ident = c("treated", "treated", "treated", 
    "treated", "treated", "treated"), nCount_RNA = c(1892, 307, 1348, 
    3699, 4205, 4468), nFeature_RNA = c(960L, 243L, 765L, 1612L, 
    1341L, 1644L), percent.mt = c(0.211416490486258, 1.62866449511401, 
    4.45103857566766, 4.4065963773993, 0.0713436385255648, 3.87197851387645
    ), RNA_snn_res.0.5 = structure(c(11L, 11L, 5L, 6L, 11L, 13L), .Label = c("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", 
    "13", "14", "15", "16", "17", "18", "19"), class = "factor"), seurat_clusters = structure(c(11L, 11L, 5L, 6L, 11L, 13L), .Label = c("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19"), class = "factor"), S.Score = c(0.476893835992198, -0.0200784617568548, -0.0335915198305002, -0.0247184276246385, 0.010785196602457, 0.0190008903712199), G2M.Score = c(0.204441469200986, 0.173804859670862, -0.0313235510969097, -0.0376796363661889, -0.0559526905696905, -0.0122031631356698), Phase = structure(c(3L, 2L, 1L, 1L, 3L, 3L), .Label = c("G1", "G2M", "S"), class = "factor"), old.ident = structure(c(7L,7L, 1L, 4L, 7L, 9L), .Label = c("Fibroblast", "T cell", "Macrophage", "Stellate", "Acinar", "Endothelial", "Tumor", "B cell", "Mast cell", "Ductal", "Islets of Langerhans"), class = "factor")), row.names = c("treated_AAACGCTAGCGGGTTA-1", "treated_AAAGGTAAGTACAGAT-1", "treated_AAAGTGAGTTTGATCG-1", "treated_AAATGGACAAAGTGTA-1", 
    "treated_AACAAAGGTCGACTTA-1", "treated_AACAGGGTCCTAGCCT-1"), class = "data.frame")


output of dput(tail(all.combined@metadata))

structure(list(orig.ident = c("untreated", "untreated", "untreated", 
"untreated", "untreated", "untreated"), nCount_RNA = c(901, 823, 
1184, 1835, 1147, 1407), nFeature_RNA = c(482L, 479L, 649L, 1043L, 
604L, 709L), percent.mt = c(1.77580466148724, 2.91616038882138, 
4.22297297297297, 3.86920980926431, 2.0052310374891, 4.05117270788913
), RNA_snn_res.0.5 = structure(c(7L, 7L, 7L, 14L, 7L, 7L), .Label = c("0", 
"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", 
"13", "14", "15", "16", "17", "18", "19"), class = "factor"), 
    seurat_clusters = structure(c(7L, 7L, 7L, 14L, 7L, 7L), .Label = c("0", 
    "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", 
    "12", "13", "14", "15", "16", "17", "18", "19"), class = "factor"), 
    S.Score = c(-0.0320858200243315, 0.0304725660342869, 0.0215996091745327, 
    0.0384166213301423, 0.144956251122548, -0.0242770509986111
    ), G2M.Score = c(0.0904224391544142, 0.050148242050667, -0.0178041670730754, 
    -0.0112596867977946, -0.0519554524339088, -0.0136533184257381
    ), Phase = structure(c(2L, 2L, 3L, 3L, 3L, 1L), .Label = c("G1", 
    "G2M", "S"), class = "factor"), old.ident = structure(c(5L, 
    5L, 5L, 5L, 5L, 5L), .Label = c("Fibroblast", "T cell", "Macrophage", 
    "Stellate", "Acinar", "Endothelial", "Tumor", "B cell", "Mast cell", 
    "Ductal", "Islets of Langerhans"), class = "factor")), row.names = c("untreated_TTTGGTTGTCTAATCG-18", 
"untreated_TTTGGTTTCCCGAGGT-18", "untreated_TTTGTTGAGAACTGAT-18", 
"untreated_TTTGTTGAGCTCGGCT-18", "untreated_TTTGTTGAGTGCCTCG-18", 
"untreated_TTTGTTGCACGGTGCT-18"), class = "data.frame")


Been using this code to generate the previous graph.

ggplot(CC, aes(x = Condition, y = Percent, fill = Cell_Cycle))+
  geom_bar(stat = "identity")+
  geom_text(aes(label = paste(round(Percent,2),"%")), position = position_stack(vjust =  0.5))
Based on your example, you can use count for each phase of cell cycle for each cell types in each condition. Here, I'm using dplyr package to do that but most likely, you could have the same output using various methods:
DF &lt;- rbind(dfhead, dftail)

library(dplyr)
DF_Count &lt;- DF %&gt;%group_by(orig.ident,Phase,old.ident) %&gt;%
  count() %&gt;%
  ungroup() %&gt;%
  group_by(orig.ident,old.ident) %&gt;%
  mutate(Freq = n/sum(n)*100)

# A tibble: 8 x 5
# Groups:   orig.ident, old.ident [5]
  orig.ident Phase old.ident      n  Freq
  &lt;chr&gt;      &lt;fct&gt; &lt;fct&gt;      &lt;int&gt; &lt;dbl&gt;
1 treated    G1    Fibroblast     1 100  
2 treated    G1    Stellate       1 100  
3 treated    G2M   Tumor          1  33.3
4 treated    S     Tumor          2  66.7
5 treated    S     Mast cell      1 100  
6 untreated  G1    Acinar         1  16.7
7 untreated  G2M   Acinar         2  33.3
8 untreated  S     Acinar         3  50  

As you can see, DF_Count has the frequency for each cell types of each phase of the cell cycle in function of the condition. We can use DF_Count to get the following plot. Using facet_wrap, you can create two panels based on the condition column and thus represent the cell cycle of each cell types in function of the treatment condition:
ggplot(DF_Count, aes(x = old.ident, y = Freq, fill = Phase))+
  geom_col()+
  geom_text(aes(label = paste(round(Freq, 2),&quot;%&quot;)),position = position_stack(vjust = 0.5))+
  facet_wrap(~orig.ident)


Does it look what you are expecting ?
NB: DF here is the addition of your head and tail of your all.combined dataframe.