How to deal with the “pixelization” of overlapping curves in Matplotlib
I have the following problem: when I plot two or more curves (of the same linewidth) they look "pixelized" at the regions where they overlap.
Here's an example:
x = np.linspace(0, np.pi, 100)
y1 = np.sin(x)
y2 = np.zeros(x.shape)
y2[:51] = np.sin(x[:51])
y2[51:] = 2 - np.sin(x[51:])
fig, ax = plt.subplots(1, 1, figsize=(3,3))
ax.plot(x, y1, lw=4, color='k')
ax.plot(x, y2, lw=4, color='yellow')
plt.show()
To my understanding, this is happening because the pixels at the curve edges have some level of transparency which makes them more smooth-looking. However, there is this side effect in the case of overlapping curves: the edge-pixels of the first curve are visible through the edge-pixels of the second curve.
How to deal with this side effect? One idea is to increase the width of the last curve, however this solution is not ideal for me because I would like the curves to have exactly the same width at the regions where they do not overlap.
python matplotlib plot curve
add a comment |
I have the following problem: when I plot two or more curves (of the same linewidth) they look "pixelized" at the regions where they overlap.
Here's an example:
x = np.linspace(0, np.pi, 100)
y1 = np.sin(x)
y2 = np.zeros(x.shape)
y2[:51] = np.sin(x[:51])
y2[51:] = 2 - np.sin(x[51:])
fig, ax = plt.subplots(1, 1, figsize=(3,3))
ax.plot(x, y1, lw=4, color='k')
ax.plot(x, y2, lw=4, color='yellow')
plt.show()
To my understanding, this is happening because the pixels at the curve edges have some level of transparency which makes them more smooth-looking. However, there is this side effect in the case of overlapping curves: the edge-pixels of the first curve are visible through the edge-pixels of the second curve.
How to deal with this side effect? One idea is to increase the width of the last curve, however this solution is not ideal for me because I would like the curves to have exactly the same width at the regions where they do not overlap.
python matplotlib plot curve
add a comment |
I have the following problem: when I plot two or more curves (of the same linewidth) they look "pixelized" at the regions where they overlap.
Here's an example:
x = np.linspace(0, np.pi, 100)
y1 = np.sin(x)
y2 = np.zeros(x.shape)
y2[:51] = np.sin(x[:51])
y2[51:] = 2 - np.sin(x[51:])
fig, ax = plt.subplots(1, 1, figsize=(3,3))
ax.plot(x, y1, lw=4, color='k')
ax.plot(x, y2, lw=4, color='yellow')
plt.show()
To my understanding, this is happening because the pixels at the curve edges have some level of transparency which makes them more smooth-looking. However, there is this side effect in the case of overlapping curves: the edge-pixels of the first curve are visible through the edge-pixels of the second curve.
How to deal with this side effect? One idea is to increase the width of the last curve, however this solution is not ideal for me because I would like the curves to have exactly the same width at the regions where they do not overlap.
python matplotlib plot curve
I have the following problem: when I plot two or more curves (of the same linewidth) they look "pixelized" at the regions where they overlap.
Here's an example:
x = np.linspace(0, np.pi, 100)
y1 = np.sin(x)
y2 = np.zeros(x.shape)
y2[:51] = np.sin(x[:51])
y2[51:] = 2 - np.sin(x[51:])
fig, ax = plt.subplots(1, 1, figsize=(3,3))
ax.plot(x, y1, lw=4, color='k')
ax.plot(x, y2, lw=4, color='yellow')
plt.show()
To my understanding, this is happening because the pixels at the curve edges have some level of transparency which makes them more smooth-looking. However, there is this side effect in the case of overlapping curves: the edge-pixels of the first curve are visible through the edge-pixels of the second curve.
How to deal with this side effect? One idea is to increase the width of the last curve, however this solution is not ideal for me because I would like the curves to have exactly the same width at the regions where they do not overlap.
python matplotlib plot curve
python matplotlib plot curve
edited Nov 15 '18 at 8:35
AndyK
asked Nov 14 '18 at 23:21
AndyKAndyK
995818
995818
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
The effect you describe is called antialiasing. It's usually wanted to obtain smoother images. You can turn antialiasing off on a per artist basis. (However, not all artists really obey to the setting in every backend.)
For the plot
this could look like
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, np.pi, 100)
y1 = np.sin(x)
y2 = np.zeros(x.shape)
y2[:51] = np.sin(x[:51])
y2[51:] = 2 - np.sin(x[51:])
fig, axes = plt.subplots(1,2, figsize=(6,3))
for aa, ax in zip([True, False], axes.flat):
ax.plot(x, y1, lw=4, color='k', antialiased=aa)
ax.plot(x, y2, lw=4, color='yellow', antialiased=aa)
plt.show()
As consequence when antialiasing is turned off, a pixel is either occupied by the respective color of the line, or not.
Thanks, I didn't know that. However setting antialiasing to False makes the curves look pixelated, so this solves one problem but creates another one. It seems that the best option is to increase the width of the second curve and keep the antialiasing.
– AndyK
Nov 15 '18 at 7:57
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%2f53310246%2fhow-to-deal-with-the-pixelization-of-overlapping-curves-in-matplotlib%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
The effect you describe is called antialiasing. It's usually wanted to obtain smoother images. You can turn antialiasing off on a per artist basis. (However, not all artists really obey to the setting in every backend.)
For the plot
this could look like
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, np.pi, 100)
y1 = np.sin(x)
y2 = np.zeros(x.shape)
y2[:51] = np.sin(x[:51])
y2[51:] = 2 - np.sin(x[51:])
fig, axes = plt.subplots(1,2, figsize=(6,3))
for aa, ax in zip([True, False], axes.flat):
ax.plot(x, y1, lw=4, color='k', antialiased=aa)
ax.plot(x, y2, lw=4, color='yellow', antialiased=aa)
plt.show()
As consequence when antialiasing is turned off, a pixel is either occupied by the respective color of the line, or not.
Thanks, I didn't know that. However setting antialiasing to False makes the curves look pixelated, so this solves one problem but creates another one. It seems that the best option is to increase the width of the second curve and keep the antialiasing.
– AndyK
Nov 15 '18 at 7:57
add a comment |
The effect you describe is called antialiasing. It's usually wanted to obtain smoother images. You can turn antialiasing off on a per artist basis. (However, not all artists really obey to the setting in every backend.)
For the plot
this could look like
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, np.pi, 100)
y1 = np.sin(x)
y2 = np.zeros(x.shape)
y2[:51] = np.sin(x[:51])
y2[51:] = 2 - np.sin(x[51:])
fig, axes = plt.subplots(1,2, figsize=(6,3))
for aa, ax in zip([True, False], axes.flat):
ax.plot(x, y1, lw=4, color='k', antialiased=aa)
ax.plot(x, y2, lw=4, color='yellow', antialiased=aa)
plt.show()
As consequence when antialiasing is turned off, a pixel is either occupied by the respective color of the line, or not.
Thanks, I didn't know that. However setting antialiasing to False makes the curves look pixelated, so this solves one problem but creates another one. It seems that the best option is to increase the width of the second curve and keep the antialiasing.
– AndyK
Nov 15 '18 at 7:57
add a comment |
The effect you describe is called antialiasing. It's usually wanted to obtain smoother images. You can turn antialiasing off on a per artist basis. (However, not all artists really obey to the setting in every backend.)
For the plot
this could look like
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, np.pi, 100)
y1 = np.sin(x)
y2 = np.zeros(x.shape)
y2[:51] = np.sin(x[:51])
y2[51:] = 2 - np.sin(x[51:])
fig, axes = plt.subplots(1,2, figsize=(6,3))
for aa, ax in zip([True, False], axes.flat):
ax.plot(x, y1, lw=4, color='k', antialiased=aa)
ax.plot(x, y2, lw=4, color='yellow', antialiased=aa)
plt.show()
As consequence when antialiasing is turned off, a pixel is either occupied by the respective color of the line, or not.
The effect you describe is called antialiasing. It's usually wanted to obtain smoother images. You can turn antialiasing off on a per artist basis. (However, not all artists really obey to the setting in every backend.)
For the plot
this could look like
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, np.pi, 100)
y1 = np.sin(x)
y2 = np.zeros(x.shape)
y2[:51] = np.sin(x[:51])
y2[51:] = 2 - np.sin(x[51:])
fig, axes = plt.subplots(1,2, figsize=(6,3))
for aa, ax in zip([True, False], axes.flat):
ax.plot(x, y1, lw=4, color='k', antialiased=aa)
ax.plot(x, y2, lw=4, color='yellow', antialiased=aa)
plt.show()
As consequence when antialiasing is turned off, a pixel is either occupied by the respective color of the line, or not.
answered Nov 14 '18 at 23:57
ImportanceOfBeingErnestImportanceOfBeingErnest
134k13148224
134k13148224
Thanks, I didn't know that. However setting antialiasing to False makes the curves look pixelated, so this solves one problem but creates another one. It seems that the best option is to increase the width of the second curve and keep the antialiasing.
– AndyK
Nov 15 '18 at 7:57
add a comment |
Thanks, I didn't know that. However setting antialiasing to False makes the curves look pixelated, so this solves one problem but creates another one. It seems that the best option is to increase the width of the second curve and keep the antialiasing.
– AndyK
Nov 15 '18 at 7:57
Thanks, I didn't know that. However setting antialiasing to False makes the curves look pixelated, so this solves one problem but creates another one. It seems that the best option is to increase the width of the second curve and keep the antialiasing.
– AndyK
Nov 15 '18 at 7:57
Thanks, I didn't know that. However setting antialiasing to False makes the curves look pixelated, so this solves one problem but creates another one. It seems that the best option is to increase the width of the second curve and keep the antialiasing.
– AndyK
Nov 15 '18 at 7:57
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%2f53310246%2fhow-to-deal-with-the-pixelization-of-overlapping-curves-in-matplotlib%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