Plot function only plots one amount in this dataframe. What could be the reason?
I have created a long format dataframe
Category Amount
1 Angry 0.00000010230325
2 Fear 0.00000007393743
3 Happy 0.99942147731781
4 Neutral 0.00057571416255
5 Sad 0.00000002021321
6 Surprise 0.00000260657316
And the code is:
library(tidyverse)
library(ggplot2)
# There are plenty of ways to reshape the data frame,
# but I think `tidyr::gather()` is the easiest
dfr_long <- gather(dfr, key = "Category", value = "Amount")
ggplot(data = dfr_long, aes(x = Category, y = Amount)) +
geom_bar(stat = "identity")
However, as you see in the image, only Happy gets plotted and the rest are all in same level. I even tried to change the ylim to c(-1,0.99) but the plot still looks the same. How can I fix this?
r dataframe ggplot2 tidyverse
|
show 3 more comments
I have created a long format dataframe
Category Amount
1 Angry 0.00000010230325
2 Fear 0.00000007393743
3 Happy 0.99942147731781
4 Neutral 0.00057571416255
5 Sad 0.00000002021321
6 Surprise 0.00000260657316
And the code is:
library(tidyverse)
library(ggplot2)
# There are plenty of ways to reshape the data frame,
# but I think `tidyr::gather()` is the easiest
dfr_long <- gather(dfr, key = "Category", value = "Amount")
ggplot(data = dfr_long, aes(x = Category, y = Amount)) +
geom_bar(stat = "identity")
However, as you see in the image, only Happy gets plotted and the rest are all in same level. I even tried to change the ylim to c(-1,0.99) but the plot still looks the same. How can I fix this?
r dataframe ggplot2 tidyverse
2
The value for happy is greater than 0.999. All other values are less than 0.001. You cannot expect to see those small values in a plot that is scaled 0 to 1. The other values should be less than 1/1000 the height of happy.
– G5W
Nov 26 '18 at 0:18
@neilfws I tried to change the ylim values but it still wouldnt plot. Is it not possible at all to plot such values?
– codeybanks
Nov 26 '18 at 0:22
1
They are being plotted. They're just minuscule. You can try+ scale_y_continuous(trans = "sqrt")
but you then need to make sure you note the transformation in the plot labels.
– hrbrmstr
Nov 26 '18 at 0:24
The issue is the scale, as @G5W pointed out. You could try a log scale, e.g.+ scale_y_log10()
, but then bars will not be appropriate, you could try points instead.
– neilfws
Nov 26 '18 at 0:26
1
@neilfws or multiplyAmount
by ~100000000
and uselog10
and change the Y labels and add alot of notes about the transformation :-) @codeybanks we don't really know what these values represent but I'd suggest the values of the other categories are so small that they may be nigh irrelevant.
– hrbrmstr
Nov 26 '18 at 0:29
|
show 3 more comments
I have created a long format dataframe
Category Amount
1 Angry 0.00000010230325
2 Fear 0.00000007393743
3 Happy 0.99942147731781
4 Neutral 0.00057571416255
5 Sad 0.00000002021321
6 Surprise 0.00000260657316
And the code is:
library(tidyverse)
library(ggplot2)
# There are plenty of ways to reshape the data frame,
# but I think `tidyr::gather()` is the easiest
dfr_long <- gather(dfr, key = "Category", value = "Amount")
ggplot(data = dfr_long, aes(x = Category, y = Amount)) +
geom_bar(stat = "identity")
However, as you see in the image, only Happy gets plotted and the rest are all in same level. I even tried to change the ylim to c(-1,0.99) but the plot still looks the same. How can I fix this?
r dataframe ggplot2 tidyverse
I have created a long format dataframe
Category Amount
1 Angry 0.00000010230325
2 Fear 0.00000007393743
3 Happy 0.99942147731781
4 Neutral 0.00057571416255
5 Sad 0.00000002021321
6 Surprise 0.00000260657316
And the code is:
library(tidyverse)
library(ggplot2)
# There are plenty of ways to reshape the data frame,
# but I think `tidyr::gather()` is the easiest
dfr_long <- gather(dfr, key = "Category", value = "Amount")
ggplot(data = dfr_long, aes(x = Category, y = Amount)) +
geom_bar(stat = "identity")
However, as you see in the image, only Happy gets plotted and the rest are all in same level. I even tried to change the ylim to c(-1,0.99) but the plot still looks the same. How can I fix this?
r dataframe ggplot2 tidyverse
r dataframe ggplot2 tidyverse
edited Nov 26 '18 at 0:18
neilfws
18.2k53749
18.2k53749
asked Nov 26 '18 at 0:15
codeybankscodeybanks
205
205
2
The value for happy is greater than 0.999. All other values are less than 0.001. You cannot expect to see those small values in a plot that is scaled 0 to 1. The other values should be less than 1/1000 the height of happy.
– G5W
Nov 26 '18 at 0:18
@neilfws I tried to change the ylim values but it still wouldnt plot. Is it not possible at all to plot such values?
– codeybanks
Nov 26 '18 at 0:22
1
They are being plotted. They're just minuscule. You can try+ scale_y_continuous(trans = "sqrt")
but you then need to make sure you note the transformation in the plot labels.
– hrbrmstr
Nov 26 '18 at 0:24
The issue is the scale, as @G5W pointed out. You could try a log scale, e.g.+ scale_y_log10()
, but then bars will not be appropriate, you could try points instead.
– neilfws
Nov 26 '18 at 0:26
1
@neilfws or multiplyAmount
by ~100000000
and uselog10
and change the Y labels and add alot of notes about the transformation :-) @codeybanks we don't really know what these values represent but I'd suggest the values of the other categories are so small that they may be nigh irrelevant.
– hrbrmstr
Nov 26 '18 at 0:29
|
show 3 more comments
2
The value for happy is greater than 0.999. All other values are less than 0.001. You cannot expect to see those small values in a plot that is scaled 0 to 1. The other values should be less than 1/1000 the height of happy.
– G5W
Nov 26 '18 at 0:18
@neilfws I tried to change the ylim values but it still wouldnt plot. Is it not possible at all to plot such values?
– codeybanks
Nov 26 '18 at 0:22
1
They are being plotted. They're just minuscule. You can try+ scale_y_continuous(trans = "sqrt")
but you then need to make sure you note the transformation in the plot labels.
– hrbrmstr
Nov 26 '18 at 0:24
The issue is the scale, as @G5W pointed out. You could try a log scale, e.g.+ scale_y_log10()
, but then bars will not be appropriate, you could try points instead.
– neilfws
Nov 26 '18 at 0:26
1
@neilfws or multiplyAmount
by ~100000000
and uselog10
and change the Y labels and add alot of notes about the transformation :-) @codeybanks we don't really know what these values represent but I'd suggest the values of the other categories are so small that they may be nigh irrelevant.
– hrbrmstr
Nov 26 '18 at 0:29
2
2
The value for happy is greater than 0.999. All other values are less than 0.001. You cannot expect to see those small values in a plot that is scaled 0 to 1. The other values should be less than 1/1000 the height of happy.
– G5W
Nov 26 '18 at 0:18
The value for happy is greater than 0.999. All other values are less than 0.001. You cannot expect to see those small values in a plot that is scaled 0 to 1. The other values should be less than 1/1000 the height of happy.
– G5W
Nov 26 '18 at 0:18
@neilfws I tried to change the ylim values but it still wouldnt plot. Is it not possible at all to plot such values?
– codeybanks
Nov 26 '18 at 0:22
@neilfws I tried to change the ylim values but it still wouldnt plot. Is it not possible at all to plot such values?
– codeybanks
Nov 26 '18 at 0:22
1
1
They are being plotted. They're just minuscule. You can try
+ scale_y_continuous(trans = "sqrt")
but you then need to make sure you note the transformation in the plot labels.– hrbrmstr
Nov 26 '18 at 0:24
They are being plotted. They're just minuscule. You can try
+ scale_y_continuous(trans = "sqrt")
but you then need to make sure you note the transformation in the plot labels.– hrbrmstr
Nov 26 '18 at 0:24
The issue is the scale, as @G5W pointed out. You could try a log scale, e.g.
+ scale_y_log10()
, but then bars will not be appropriate, you could try points instead.– neilfws
Nov 26 '18 at 0:26
The issue is the scale, as @G5W pointed out. You could try a log scale, e.g.
+ scale_y_log10()
, but then bars will not be appropriate, you could try points instead.– neilfws
Nov 26 '18 at 0:26
1
1
@neilfws or multiply
Amount
by ~100000000
and use log10
and change the Y labels and add alot of notes about the transformation :-) @codeybanks we don't really know what these values represent but I'd suggest the values of the other categories are so small that they may be nigh irrelevant.– hrbrmstr
Nov 26 '18 at 0:29
@neilfws or multiply
Amount
by ~100000000
and use log10
and change the Y labels and add alot of notes about the transformation :-) @codeybanks we don't really know what these values represent but I'd suggest the values of the other categories are so small that they may be nigh irrelevant.– hrbrmstr
Nov 26 '18 at 0:29
|
show 3 more comments
1 Answer
1
active
oldest
votes
Since your claim against my comment was woefully incorrect:
read.table(text="Category Amount
Angry 0.00000010230325
Fear 0.00000007393743
Happy 0.99942147731781
Neutral 0.00057571416255
Sad 0.00000002021321
Surprise 0.00000260657316", header=TRUE, stringsAsFactors=FALSE) -> dfr
ggplot(data = dfr, aes(x = Category, y = 100000000*Amount)) +
geom_bar(stat = "identity") +
scale_y_continuous(trans = "log10")
NOTE that ^^ seriously misrepresents the data and requires a ton of labeling to make sure your readers do not misinterpret it.
This:
ggplot(data = dfr, aes(x = Category, y = Amount)) +
geom_bar(stat = "identity") +
scale_y_continuous(trans = "sqrt")
is somewhat better but still requires you to do a substantial amount of labeling to ensure the data is not being misrepresented.
This:
options(scipen = 999)
dplyr::arrange(dfr, desc(Amount)) %>%
mutate(Category = factor(Category, levels = Category)) %>%
mutate(txt_col = dplyr::case_when(
Category == "Happy" ~ "white",
TRUE ~ "black"
)) %>%
ggplot(aes(x = Category, y = 1)) +
geom_tile(aes(fill = Amount), color = "white", size=0.125) +
geom_text(aes(label = Amount, color = I(txt_col)), size=2.5) +
viridis::scale_fill_viridis(direction = -1) +
coord_equal() +
labs(
x = NULL, y = NULL
) +
hrbrthemes::theme_ipsum_rc(grid="") +
theme(axis.text.y = element_blank())
is an alternate way to show the data but it's no more effective than a basic, ordered table would be IMO.
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53473309%2fplot-function-only-plots-one-amount-in-this-dataframe-what-could-be-the-reason%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
Since your claim against my comment was woefully incorrect:
read.table(text="Category Amount
Angry 0.00000010230325
Fear 0.00000007393743
Happy 0.99942147731781
Neutral 0.00057571416255
Sad 0.00000002021321
Surprise 0.00000260657316", header=TRUE, stringsAsFactors=FALSE) -> dfr
ggplot(data = dfr, aes(x = Category, y = 100000000*Amount)) +
geom_bar(stat = "identity") +
scale_y_continuous(trans = "log10")
NOTE that ^^ seriously misrepresents the data and requires a ton of labeling to make sure your readers do not misinterpret it.
This:
ggplot(data = dfr, aes(x = Category, y = Amount)) +
geom_bar(stat = "identity") +
scale_y_continuous(trans = "sqrt")
is somewhat better but still requires you to do a substantial amount of labeling to ensure the data is not being misrepresented.
This:
options(scipen = 999)
dplyr::arrange(dfr, desc(Amount)) %>%
mutate(Category = factor(Category, levels = Category)) %>%
mutate(txt_col = dplyr::case_when(
Category == "Happy" ~ "white",
TRUE ~ "black"
)) %>%
ggplot(aes(x = Category, y = 1)) +
geom_tile(aes(fill = Amount), color = "white", size=0.125) +
geom_text(aes(label = Amount, color = I(txt_col)), size=2.5) +
viridis::scale_fill_viridis(direction = -1) +
coord_equal() +
labs(
x = NULL, y = NULL
) +
hrbrthemes::theme_ipsum_rc(grid="") +
theme(axis.text.y = element_blank())
is an alternate way to show the data but it's no more effective than a basic, ordered table would be IMO.
add a comment |
Since your claim against my comment was woefully incorrect:
read.table(text="Category Amount
Angry 0.00000010230325
Fear 0.00000007393743
Happy 0.99942147731781
Neutral 0.00057571416255
Sad 0.00000002021321
Surprise 0.00000260657316", header=TRUE, stringsAsFactors=FALSE) -> dfr
ggplot(data = dfr, aes(x = Category, y = 100000000*Amount)) +
geom_bar(stat = "identity") +
scale_y_continuous(trans = "log10")
NOTE that ^^ seriously misrepresents the data and requires a ton of labeling to make sure your readers do not misinterpret it.
This:
ggplot(data = dfr, aes(x = Category, y = Amount)) +
geom_bar(stat = "identity") +
scale_y_continuous(trans = "sqrt")
is somewhat better but still requires you to do a substantial amount of labeling to ensure the data is not being misrepresented.
This:
options(scipen = 999)
dplyr::arrange(dfr, desc(Amount)) %>%
mutate(Category = factor(Category, levels = Category)) %>%
mutate(txt_col = dplyr::case_when(
Category == "Happy" ~ "white",
TRUE ~ "black"
)) %>%
ggplot(aes(x = Category, y = 1)) +
geom_tile(aes(fill = Amount), color = "white", size=0.125) +
geom_text(aes(label = Amount, color = I(txt_col)), size=2.5) +
viridis::scale_fill_viridis(direction = -1) +
coord_equal() +
labs(
x = NULL, y = NULL
) +
hrbrthemes::theme_ipsum_rc(grid="") +
theme(axis.text.y = element_blank())
is an alternate way to show the data but it's no more effective than a basic, ordered table would be IMO.
add a comment |
Since your claim against my comment was woefully incorrect:
read.table(text="Category Amount
Angry 0.00000010230325
Fear 0.00000007393743
Happy 0.99942147731781
Neutral 0.00057571416255
Sad 0.00000002021321
Surprise 0.00000260657316", header=TRUE, stringsAsFactors=FALSE) -> dfr
ggplot(data = dfr, aes(x = Category, y = 100000000*Amount)) +
geom_bar(stat = "identity") +
scale_y_continuous(trans = "log10")
NOTE that ^^ seriously misrepresents the data and requires a ton of labeling to make sure your readers do not misinterpret it.
This:
ggplot(data = dfr, aes(x = Category, y = Amount)) +
geom_bar(stat = "identity") +
scale_y_continuous(trans = "sqrt")
is somewhat better but still requires you to do a substantial amount of labeling to ensure the data is not being misrepresented.
This:
options(scipen = 999)
dplyr::arrange(dfr, desc(Amount)) %>%
mutate(Category = factor(Category, levels = Category)) %>%
mutate(txt_col = dplyr::case_when(
Category == "Happy" ~ "white",
TRUE ~ "black"
)) %>%
ggplot(aes(x = Category, y = 1)) +
geom_tile(aes(fill = Amount), color = "white", size=0.125) +
geom_text(aes(label = Amount, color = I(txt_col)), size=2.5) +
viridis::scale_fill_viridis(direction = -1) +
coord_equal() +
labs(
x = NULL, y = NULL
) +
hrbrthemes::theme_ipsum_rc(grid="") +
theme(axis.text.y = element_blank())
is an alternate way to show the data but it's no more effective than a basic, ordered table would be IMO.
Since your claim against my comment was woefully incorrect:
read.table(text="Category Amount
Angry 0.00000010230325
Fear 0.00000007393743
Happy 0.99942147731781
Neutral 0.00057571416255
Sad 0.00000002021321
Surprise 0.00000260657316", header=TRUE, stringsAsFactors=FALSE) -> dfr
ggplot(data = dfr, aes(x = Category, y = 100000000*Amount)) +
geom_bar(stat = "identity") +
scale_y_continuous(trans = "log10")
NOTE that ^^ seriously misrepresents the data and requires a ton of labeling to make sure your readers do not misinterpret it.
This:
ggplot(data = dfr, aes(x = Category, y = Amount)) +
geom_bar(stat = "identity") +
scale_y_continuous(trans = "sqrt")
is somewhat better but still requires you to do a substantial amount of labeling to ensure the data is not being misrepresented.
This:
options(scipen = 999)
dplyr::arrange(dfr, desc(Amount)) %>%
mutate(Category = factor(Category, levels = Category)) %>%
mutate(txt_col = dplyr::case_when(
Category == "Happy" ~ "white",
TRUE ~ "black"
)) %>%
ggplot(aes(x = Category, y = 1)) +
geom_tile(aes(fill = Amount), color = "white", size=0.125) +
geom_text(aes(label = Amount, color = I(txt_col)), size=2.5) +
viridis::scale_fill_viridis(direction = -1) +
coord_equal() +
labs(
x = NULL, y = NULL
) +
hrbrthemes::theme_ipsum_rc(grid="") +
theme(axis.text.y = element_blank())
is an alternate way to show the data but it's no more effective than a basic, ordered table would be IMO.
edited Nov 26 '18 at 0:51
answered Nov 26 '18 at 0:42
hrbrmstrhrbrmstr
61.5k691152
61.5k691152
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53473309%2fplot-function-only-plots-one-amount-in-this-dataframe-what-could-be-the-reason%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
2
The value for happy is greater than 0.999. All other values are less than 0.001. You cannot expect to see those small values in a plot that is scaled 0 to 1. The other values should be less than 1/1000 the height of happy.
– G5W
Nov 26 '18 at 0:18
@neilfws I tried to change the ylim values but it still wouldnt plot. Is it not possible at all to plot such values?
– codeybanks
Nov 26 '18 at 0:22
1
They are being plotted. They're just minuscule. You can try
+ scale_y_continuous(trans = "sqrt")
but you then need to make sure you note the transformation in the plot labels.– hrbrmstr
Nov 26 '18 at 0:24
The issue is the scale, as @G5W pointed out. You could try a log scale, e.g.
+ scale_y_log10()
, but then bars will not be appropriate, you could try points instead.– neilfws
Nov 26 '18 at 0:26
1
@neilfws or multiply
Amount
by ~100000000
and uselog10
and change the Y labels and add alot of notes about the transformation :-) @codeybanks we don't really know what these values represent but I'd suggest the values of the other categories are so small that they may be nigh irrelevant.– hrbrmstr
Nov 26 '18 at 0:29