R ggplot2:如何充分捕获绘图中的数据分布

R ggplot2:如何充分捕获绘图中的数据分布,r,plot,ggplot2,data-visualization,R,Plot,Ggplot2,Data Visualization,使用斯坦福的情绪分类例程(包含在CoreNLP工具包中),我试图在给定文档中绘制每个句子的“情绪”。情绪分类的数据基本上由五列n行组成: 0.0374 0.1311 0.1502 0.5761 0.1052 0.0117 0.0301 0.1748 0.5980 0.1854 0.1261 0.7332 0.1182 0.0156 0.0069 每一行表示输入分类器的文件中的一个句子,该行中的每一列表示关于句子情绪值的置信区间:第一列包含算法对给定句子具有“非常消极”情绪的置信度,第二列包含对

使用斯坦福的情绪分类例程(包含在CoreNLP工具包中),我试图在给定文档中绘制每个句子的“情绪”。情绪分类的数据基本上由五列n行组成:

0.0374 0.1311 0.1502 0.5761 0.1052
0.0117 0.0301 0.1748 0.5980 0.1854
0.1261 0.7332 0.1182 0.0156 0.0069
每一行表示输入分类器的文件中的一个句子,该行中的每一列表示关于句子情绪值的置信区间:第一列包含算法对给定句子具有“非常消极”情绪的置信度,第二列包含对该句子具有“某种负面”情绪的信心,第三列表示对该句子包含“无情绪”(即描述性)的信心;第四列表示对句子“积极”的信心,第五列表示对句子“非常积极”的信心

对于数据中的每一行,很容易识别具有最大值的列,然后按顺序绘制这些值,如果行中的最大值位于第一列或第二列,则使用负值;如果最大值位于第三列,则使用零;如果最大值位于第四行或第五行,则使用正值:


但是,如果我只绘制每行信心值最大的情绪分数(这就是我在上面的图中所做的),我最终会抛出每行五列数据中的四列。是否可以使用ggplot2以合理直观的方式表示此数据的所有行?我意识到这个问题与主题无关,但我认为其他更熟悉ggplot(以及更广泛的dataviz)的人可能会为我的数据结构提供更好的可视化方法。无论如何,我都渴望听到其他人对这个问题的看法。

因此,这里是我的评论的扩展,使用您的《罗密欧与朱丽叶》数据集

您可以使用加权平均值,或“预期情绪”,而不是使用每个句子的最大概率作为情绪的替代。每句话的计算如下:

L=[-2,-1,0,1,2]

E(Si)=∑(pi,j×Lj)

其中i,j是行、列编号,Lj是L的第j个元素

您还可以计算每个句子的情绪不确定性,如下所示:

V(Si)=∑pi,j×[Lj-E(Si)]2

在R代码中:

library(ggplot2)
library(reshape2)
P <- read.csv("romeo.and.juliet.txt",sep=" ")   # file you provided
P <- as.matrix(P)                               # needs to be a matrix
# calculate expected sentiment, E(s) based on Likert scale
# E(S) = sum(P_i * i)  [i in -2:2]
L <- c(-2,-1,0,1,2)    # Likert Scale
ES <- P %*% L          # E(S)
sentiment <- data.frame(n=1:length(ES),ES)
# calculate sentiment variability for each sentence
# V(S)  = sum(P_i * (i - E(s))^2)   [i in -2:2]
# SD(S) = sqrt(V(S))
LL <- matrix(rep(L,each=nrow(P)),ncol=ncol(P))
LL <- apply(LL,2,function(X)X-ES)
LL.sq <- LL^2
VS <- P %*% t(LL.sq)
SD <- sqrt(diag(VS))
sentiment$SD <- SD
# reshape for plotting w/ggplot
gg <- melt(sentiment,id="n")
ggplot(gg, aes(x=n,y=value,color=variable)) + 
  geom_point(size=1.5,alpha=.5) + 
  stat_smooth(method=loess, size=1)+
  facet_grid(variable~., scales="free_y")+
  scale_color_discrete(name="",labels=c("Expected Sentimant","Uncertainty"))+
  theme(legend.position="bottom")
库(ggplot2)
图书馆(E2)

P好的,您可以使用加权平均情绪,而不是使用最大概率作为情绪的替代,例如,将利克特量表
L=c(-2,-1,0,1,2)
与列相关联,并计算“预期情绪”,
ES=P%*%L
其中
P
是您的情绪分类矩阵。然后画出这个和句子的编号。你也可以计算每个句子情感的不确定性。我认为你是对的,@jlhoward,但我的问题是,第1列和第5列的标量值是多少。(非常负的意思是负的*1.5,或*2,或…?)在乘以数字之前,我需要考虑更多。然而,问题是,一旦我有了缩放值,我可以也应该绘制它们的一些组合(针对每一行),还是应该丢弃所有列,而不是具有最大值的列?使用预期情绪固有地将每一行的所有列组合在一起。只要你相信“非常负面”和“负面”之间的区别与“负面”和“中性”之间的区别相同,比例因子就无关紧要。如果你提供了整个数据集,或者其中更大的一部分,我可以向你展示(上传并提供链接)。这是罗密欧和朱丽叶的数据(每句话一行)这个答案很有帮助。分类器是在更现代的文本上训练的,我使用的是Shakes文本的现代拼写,但你是对的——数据再混乱不过了。当我看每个句子的置信度分布时,它们似乎或多或少是令人满意的,但从总体上看,数据是混乱的。(通过场景或句子集合来获取平均情绪有助于揭示模式。)