matplotlib中带有单个像素标记的散点图

时间:2016-09-28 16:45:16

标签: python matplotlib scatter-plot

我正在尝试使用散点图绘制大型数据集。 我想用matplotlib用单像素标记来绘制它。 它似乎已经解决了。

https://github.com/matplotlib/matplotlib/pull/695

但我找不到如何获得单个像素标记。

我的简化数据集(data.csv)

Length,Time
78154393,139.324091
84016477,229.159305
84626159,219.727537
102021548,225.222662
106399706,221.022827
107945741,206.760239
109741689,200.153263
126270147,220.102802
207813132,181.67058
610704756,50.59529
623110004,50.533158
653383018,52.993885
659376270,53.536834
680682368,55.97628
717978082,59.043843

我的代码如下。

import pandas as pd
import os
import numpy
import matplotlib.pyplot as plt

inputfile='data.csv'
iplevel = pd.read_csv(inputfile)
base = os.path.splitext(inputfile)[0]

fig = plt.figure()
plt.yscale('log')
#plt.xscale('log')
plt.title(' My plot:  '+base)
plt.xlabel('x')
plt.ylabel('y')
plt.scatter(iplevel['Time'], iplevel['Length'],color='black',marker=',',lw=0,s=1)
fig.tight_layout()
fig.savefig(base+'_plot.png', dpi=fig.dpi)

您可以在下面看到这些点不是单个像素。

data_plot.png

感谢任何帮助

3 个答案:

答案 0 :(得分:8)

问题

我担心您在引用的matplotlib git存储库中讨论的错误修复仅对plt.plot()有效,而对plt.scatter()无效

import matplotlib.pyplot as plt

fig = plt.figure(figsize=(4,2))
ax = fig.add_subplot(121)
ax2 = fig.add_subplot(122, sharex=ax, sharey=ax)
ax.plot([1, 2],[0.4,0.4],color='black',marker=',',lw=0, linestyle="")
ax.set_title("ax.plot")
ax2.scatter([1,2],[0.4,0.4],color='black',marker=',',lw=0, s=1)
ax2.set_title("ax.scatter")
ax.set_xlim(0,8)
ax.set_ylim(0,1)
fig.tight_layout()
print fig.dpi #prints 80 in my case
fig.savefig('plot.png', dpi=fig.dpi)

enter image description here

解决方案:设置markersize

解决方案是使用通常的"o""s"标记,但将markersize设置为恰好一个像素。由于标记大小以点给出,因此需要使用图形dpi来计算点中一个像素的大小。这是72./fig.dpi

  • For a plot`,markerize直接

    ax.plot(..., marker="o", ms=72./fig.dpi)
    
  • 对于scatter,标记大小是通过s参数给出的,该参数是方形点,

    ax.scatter(..., marker='o', s=(72./fig.dpi)**2)
    

完整示例:

import matplotlib.pyplot as plt

fig = plt.figure(figsize=(4,2))
ax = fig.add_subplot(121)
ax2 = fig.add_subplot(122, sharex=ax, sharey=ax)
ax.plot([1, 2],[0.4,0.4], marker='o',ms=72./fig.dpi, mew=0, 
        color='black', linestyle="", lw=0)
ax.set_title("ax.plot")
ax2.scatter([1,2],[0.4,0.4],color='black', marker='o', lw=0, s=(72./fig.dpi)**2)
ax2.set_title("ax.scatter")
ax.set_xlim(0,8)
ax.set_ylim(0,1)
fig.tight_layout()
fig.savefig('plot.png', dpi=fig.dpi)

enter image description here

答案 1 :(得分:3)

对于仍然想要解决这个问题的人,我找到的解决方案是在plt.scatter中指定s参数。

s参数指的是您正在绘制的点的区域。

它看起来并不完美,因为s = 1似乎覆盖了我的屏幕大约4个像素,但这肯定使它们比我能找到的任何其他东西都小。

https://matplotlib.org/devdocs/api/_as_gen/matplotlib.pyplot.scatter.html

  

s:标量或array_like,形状(n,),可选
  大小以点^ 2。默认值为rcParams ['lines.markersize'] ** 2.

答案 2 :(得分:0)

plt.scatter()参数设置为linewidths=0,并找出参数s的正确值。

来源:https://stackoverflow.com/a/45803960/4063622