Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matplotlib——带有半填充标记的散点图_Matplotlib_Marker_Scatter - Fatal编程技术网

Matplotlib——带有半填充标记的散点图

Matplotlib——带有半填充标记的散点图,matplotlib,marker,scatter,Matplotlib,Marker,Scatter,问题:在matplotlib中使用散点图,有没有简单的方法获得半填充标记 我知道半填充标记可以很容易地使用线图完成,但我想使用“散布”,因为我想使用标记大小和颜色(即,备用标记面颜色)来表示其他数据。(我相信使用散点图会更容易,因为我想从大型数据集自动生成大量图。) 我似乎无法使用散点图正确地制作半填充标记。也就是说,图中显示的不是半填充的标记,而是半填充的标记。我一直在使用matplotlib.markers.MarkerStyle,但这似乎只能让我走到一半。我能够使用下面的代码获得以下输出

问题:在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()