Matplotlib——带有半填充标记的散点图
问题:在matplotlib中使用散点图,有没有简单的方法获得半填充标记 我知道半填充标记可以很容易地使用线图完成,但我想使用“散布”,因为我想使用标记大小和颜色(即,备用标记面颜色)来表示其他数据。(我相信使用散点图会更容易,因为我想从大型数据集自动生成大量图。) 我似乎无法使用散点图正确地制作半填充标记。也就是说,图中显示的不是半填充的标记,而是半填充的标记。我一直在使用matplotlib.markers.MarkerStyle,但这似乎只能让我走到一半。我能够使用下面的代码获得以下输出Matplotlib——带有半填充标记的散点图,matplotlib,marker,scatter,Matplotlib,Marker,Scatter,问题:在matplotlib中使用散点图,有没有简单的方法获得半填充标记 我知道半填充标记可以很容易地使用线图完成,但我想使用“散布”,因为我想使用标记大小和颜色(即,备用标记面颜色)来表示其他数据。(我相信使用散点图会更容易,因为我想从大型数据集自动生成大量图。) 我似乎无法使用散点图正确地制作半填充标记。也就是说,图中显示的不是半填充的标记,而是半填充的标记。我一直在使用matplotlib.markers.MarkerStyle,但这似乎只能让我走到一半。我能够使用下面的代码获得以下输出
如评论中所述,我不明白为什么您必须使用
plt.scatter
,但如果您愿意,可以伪造组合标记:
from matplotlib.markers import MarkerStyle
from matplotlib import pyplot as plt
#data generation
import pandas as pd
import numpy as np
np.random.seed(123)
n = 10
df = pd.DataFrame({"X": np.random.randint(1, 20, n),
"Y": np.random.randint(10, 30, n),
"S": np.random.randint(50, 500, n),
"C1": np.random.choice(["red", "blue", "green"], n),
"C2": np.random.choice(["yellow", "grey"], n)})
fig, ax = plt.subplots()
ax.scatter(df.X, df.Y, s=df.S, c=df.C1, edgecolor="black", marker=MarkerStyle("o", fillstyle="right"))
ax.scatter(df.X, df.Y, s=df.S, c=df.C2, edgecolor="black", marker=MarkerStyle("o", fillstyle="left"))
plt.show()
样本输出:
当然,这也适用于连续数据:
from matplotlib import pyplot as plt
from matplotlib.markers import MarkerStyle
import pandas as pd
import numpy as np
np.random.seed(123)
n = 10
df = pd.DataFrame({"X": np.random.randint(1, 20, n),
"Y": np.random.randint(10, 30, n),
"S": np.random.randint(100, 1000, n),
"C1": np.random.randint(1, 100, n),
"C2": np.random.random(n)})
fig, ax = plt.subplots(figsize=(10,8))
im1 = ax.scatter(df.X, df.Y, s=df.S, c=df.C1, edgecolor="black", marker=MarkerStyle("o", fillstyle="right"), cmap="autumn")
im2 = ax.scatter(df.X, df.Y, s=df.S, c=df.C2, edgecolor="black", marker=MarkerStyle("o", fillstyle="left"), cmap="winter")
cbar1 = plt.colorbar(im1, ax=ax)
cbar1.set_label("right half", rotation=90)
cbar2 = plt.colorbar(im2, ax=ax)
cbar2.set_label("left half", rotation=90)
plt.show()
样本输出:
:
对于标记大小或颜色不变的散点图,绘图功能将更快。
请参阅该页上的示例使用绘图。散点图的参数中似乎没有fillstyle。也许我遗漏了什么…?为什么不能将plot与linestyle=“None”
一起使用?我打算使用大小(以及可能的替代面颜色)来显示数据集中的其他数据。我在想,为了达到这些目的,分散会更好。绘图方法有markersize
。我看到了散射的一个优点:可以通过阵列获取颜色。
from matplotlib import pyplot as plt
from matplotlib.markers import MarkerStyle
import pandas as pd
import numpy as np
np.random.seed(123)
n = 10
df = pd.DataFrame({"X": np.random.randint(1, 20, n),
"Y": np.random.randint(10, 30, n),
"S": np.random.randint(100, 1000, n),
"C1": np.random.randint(1, 100, n),
"C2": np.random.random(n)})
fig, ax = plt.subplots(figsize=(10,8))
im1 = ax.scatter(df.X, df.Y, s=df.S, c=df.C1, edgecolor="black", marker=MarkerStyle("o", fillstyle="right"), cmap="autumn")
im2 = ax.scatter(df.X, df.Y, s=df.S, c=df.C2, edgecolor="black", marker=MarkerStyle("o", fillstyle="left"), cmap="winter")
cbar1 = plt.colorbar(im1, ax=ax)
cbar1.set_label("right half", rotation=90)
cbar2 = plt.colorbar(im2, ax=ax)
cbar2.set_label("left half", rotation=90)
plt.show()