我有一个散点图,它从两个不同的数据集中绘制大量的点。在某些区域,存在大量的点,因此即使具有非常低的 alpha(例如 alpha=0.1),您也无法看穿质量。但在该 alpha 值下,您几乎看不到稀疏区域中的点。有没有一种方法可以限制堆叠点的 alpha 值,或者以某种方式使背景在密集区域下可见,同时不洗掉稀疏区域?
代码片段如下所示:
# Code to populate the datasets not included.
fig, ax = plt.subplots()
ax.scatter(x1, y1, s=12, color='red')
ax.scatter(x2, y2, s=12, color='blue', alpha=0.1)
# Plus code to do xlabels and such not included.
Run Code Online (Sandbox Code Playgroud)
产生这个:

正如您所看到的,很难看到底部红色腿的边界,但仍然使顶部蓝色腿打出。
有什么办法可以创造出这样的效果吗?
提前致谢。
编辑
一个好的建议似乎是使用 hexbin 而不是 scatter。这看起来确实很有希望,但颜色仍然不能很好地混合。例如,
ax.hexbin(x1, y1, cmap='Reds', mincnt=1, vmax=100)
ax.hexbin(x2, y2, cmap='Blues', mincnt=1, vmax=50, alpha=0.8, linewidths=0)
Run Code Online (Sandbox Code Playgroud)
产量:

如果能让蓝色和红色融合在一起,那就太好了。也许每个像素可以有一个来自一个数据集的 R 值,以及来自另一个数据集的 B 值或其他值?但在 hexbin 中似乎不是一个选项。
编辑
应用托马西洛的答案后:
谢谢,我觉得比原版好看。
我正在寻找创建一个非常类似于 nltk 的词汇分散图的图表,但我对如何构建它画了一个空白。我认为分散将是我最好的几何图形,使用“|” 作为标记,并设置 alpha,但我在设置参数时遇到了各种问题。下面是一个例子:
我在 5 年的时间内用日期时间索引 freq='D' 排列了数据框,每列代表该日期使用的特定单词的计数。例如:
tst = pd.DataFrame(index=pd.date_range(datetime.datetime(2010, 1, 1), end=datetime.datetime(2010, 2, 1), freq='D'), data=[[randint(0, 5), randint(0, 1), randint(0, 2)] for x in range(32)])
Run Code Online (Sandbox Code Playgroud)
目前我正在尝试类似以下内容:
plt.figure()
tst.plot(kind='scatter', x=tst.index, y=tst.columns, marker='|', color=sns.xkcd_rgb['dodger blue'], alpha=.05, legend=False)
yticks = plt.yticks()[0]
plt.yticks(yticks, top_words)
Run Code Online (Sandbox Code Playgroud)
上面的代码产生一个KeyError:
KeyError: "['2009-12-31T19:00:00.000000000-0500' '2010-01-01T19:00:00.000000000-0500'\n '2010-01-02T19:00:00.000000000-0500' '2010-01-03T19:00:00.000000000-0500'\n '2010-01-04T19:00:00.000000000-0500' '2010-01-05T19:00:00.000000000-0500'\n '2010-01-06T19:00:00.000000000-0500' '2010-01-07T19:00:00.000000000-0500'\n '2010-01-08T19:00:00.000000000-0500' '2010-01-09T19:00:00.000000000-0500'\n '2010-01-10T19:00:00.000000000-0500' '2010-01-11T19:00:00.000000000-0500'\n '2010-01-12T19:00:00.000000000-0500' '2010-01-13T19:00:00.000000000-0500'\n '2010-01-14T19:00:00.000000000-0500' '2010-01-15T19:00:00.000000000-0500'\n '2010-01-16T19:00:00.000000000-0500' '2010-01-17T19:00:00.000000000-0500'\n '2010-01-18T19:00:00.000000000-0500' '2010-01-19T19:00:00.000000000-0500'\n '2010-01-20T19:00:00.000000000-0500' '2010-01-21T19:00:00.000000000-0500'\n '2010-01-22T19:00:00.000000000-0500' '2010-01-23T19:00:00.000000000-0500'\n '2010-01-24T19:00:00.000000000-0500' '2010-01-25T19:00:00.000000000-0500'\n '2010-01-26T19:00:00.000000000-0500' '2010-01-27T19:00:00.000000000-0500'\n '2010-01-28T19:00:00.000000000-0500' '2010-01-29T19:00:00.000000000-0500'\n '2010-01-30T19:00:00.000000000-0500' '2010-01-31T19:00:00.000000000-0500'] not in …Run Code Online (Sandbox Code Playgroud) matplotlib scatter-plot pandas timeserieschart categorical-data
我有一个限制为 -1 到 1 的图。我知道散点图不会以大小为半径来绘制,而是以大小为点来绘制。
我需要根据每个点的大小(我将其作为半径)正确缩放绘图。通过修改以下代码可以实现这一点吗?
fig, ax = plt.subplots(1)
ax.set_title("Post Synaptic Neurons")
sizes = [x.size * 100 for x in post_synaptic_neurons]
offsets = [(x.origin[0],x.origin[1]) for x in post_synaptic_neurons]
print(sizes)
ax.scatter([x.origin[0] for x in post_synaptic_neurons], [x.origin[1] for x in post_synaptic_neurons],
cmap=plt.cm.hsv, s=sizes, alpha=0.5)
ax.set_xlim([-1,1])
ax.set_ylim([-1,1])
ax.set_aspect(1)
plt.tight_layout
Run Code Online (Sandbox Code Playgroud)
如果没有,有人可以向我解释为什么 matplotlib 没有在绘图比例上绘制具有特定半径的圆的函数吗?我没想到这会成为一个问题,但我的困难背后一定有充分的理由。
我无法弄清楚在尝试在 matplotlib 中创建散点图时如何使用颜色。
我正在尝试绘制具有不同颜色点的多个散点图来显示集群。
colors=['#12efff','#eee111','#eee00f','#e00fff','#123456','#abc222','#000000','#123fff','#1eff1f','#2edf4f','#2eaf9f','#22222f'
'#eeeff1','#eee112','#00ef00','#aa0000','#0000aa','#000999','#32efff','#23ef68','#2e3f56','#7eef1f','#eeef11']
C=1
fig = plt.figure()
ax = fig.gca(projection='3d')
for fgroups in groups:
X=[np.random.rand(50),np.random.rand(50),np.random.rand(50)]
y=[np.random.rand(50),np.random.rand(50),np.random.rand(50)]
Z=[np.random.rand(50),np.random.rand(50),np.random.rand(50)]
C=(C+1) % len(colors)
ax.scatter(X,Y,Z, s=20, c=colors[C], depthshade=True)
plt.show()
Run Code Online (Sandbox Code Playgroud)
我收到的错误如下:
ValueError: to_rgba: 无效的 rgba arg "#" to_rgb: 无效的 rgb arg "#" 无法将字符串转换为浮点数: #
看起来它将这些 RGB 参数视为浮点数。
然而,在 matplotlib 文档中,颜色是以这种风格编写的http://matplotlib.org/api/colors_api.html
我缺少什么?
我正在创建一个 highchart 散点图,其中 X 轴上包含纪元日期时间值,Y 轴上包含浮点值。问题是当我使用标签格式化程序将纪元时间值转换为可读时间值(“DD-MMM-YYYY”)时,在 X 轴上创建具有相同标题的多个标签,并且这些点不与垂直对齐X 轴上的刻度线。
我为它创建了一个 JSFiddle (链接)。我可以做什么来解决这个问题...
$(function () {
$('#container').highcharts({
chart: {
type: 'scatter',
zoomType: 'xy'
},
title: {
text: 'Errors'
},
subtitle: {
text: 'Source: Temp Data'
},
xAxis: {
allowDecimals: false,
title: {
text: 'days',
scalable: false
},
type: 'datetime',
labels: {
formatter: function () {
return Highcharts.dateFormat('%d-%b-%y', moment.unix(this.value));
}
},
tickPixelInterval: 100
},
yAxis: {
title: {
text: 'Weight (kg)'
}
},
legend: {
layout: 'vertical',
align: 'left',
verticalAlign: …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 Julia 中绘制散点图,我在那里有 3 个课程。
我想为每个类定义不同的颜色。
我试过:
using(PyPlot)
pca = readdlm("pca1_2_fam.txt", header=false);
plot(pca[:,3], pca[:,4], color = pca[:,1])
Run Code Online (Sandbox Code Playgroud)
pca 文件如下:
名称1 208094 -0.00476681 0.00822032
名称1 514876 -0.00531507 -0.00721858
名称2 515043 0.00365503 -0.01794700 名称2
515066 0.00467896 0.00420396名称3
799073 0.00811660 -0.01903420 名称3 GLTGH40
0.00380041 0.00618471
在 R 中,我只是使用以下方法做到了这一点:
colnames(pca)=c("Breed","Animal","PCA1","PCA2")
qplot(PCA1,PCA2,data=pca,color=Breed,geom=c("point")) + theme(legend.position="none")
Run Code Online (Sandbox Code Playgroud)
我想学习如何在 Julia 中做到这一点。
据我所知,我的问题与这篇文章密切相关。
我需要绘制一些标记大小与轴值严格成比例的数据。(已经在这里问过这个问题)。
我的方法如下:
transData.transform获取这两个点的像素值s=(size*dist_to_pix_ratio)**2,但这现在并不重要。)问题是:当我完全按照我所描述的操作时,我得到 y 轴和 x 轴像素数的两个不同值。
这是一个最小的代码:
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(7,7))
ax1 = fig.add_subplot(111, aspect='equal')
#setting up an empty scatterplot for pixel reference
xedges=[0.0, 1.0]
yedges=[0.0, 1.0]
emptyscatter=ax1.scatter(xedges, yedges, s=0.0)
#set axes limits
ax1.set_xlim(0.00,1.00)
ax1.set_ylim(0.00,1.00)
# Calculating the ratio of pixel-to-unit
upright = ax1.transData.transform((1.0,1.0))
lowleft = ax1.transData.transform((0.0,0.0))
x_to_pix_ratio = upright[0] - lowleft[0]
y_to_pix_ratio = upright[1] - lowleft[1]
print x_to_pix_ratio, …Run Code Online (Sandbox Code Playgroud) 我正在 d3 中处理散点图,当我单击按钮时,我需要能够更新 yAxis 域。
这就是我现在所拥有的。这是最低值和最高值。
yAxis = d3.scaleLinear().rangeRound([height, 0]);
yAxis.domain([23500, 29600]);
Run Code Online (Sandbox Code Playgroud)
当我单击按钮时,如何将域更改为类似域([26500, 33600])?
我需要将其添加到具有点击功能的按钮中吗?
d3.select('#data2010').on('click', function () {
Run Code Online (Sandbox Code Playgroud)
或者有没有办法自动寻找最低和最高值并更新它?
我正在尝试创建一个带有 x 和 y 误差的散点图,它们在四个部分中具有不同的标记和误差条颜色(例如,x=0 到 x=2 的红色,x=2 到 c=5 的蓝色等)。我使用了带有标记边界的颜色图,但我无法对错误栏做类似的事情。我尝试使用this answer to a similar question将标记、错误栏和大写字母设置为散点颜色图中的相同颜色,但我无法让它为我的代码工作(出现了一个关于数据长度不匹配或无法转换为元组)。我想我无法为我用于标记的颜色图正确修改它,或者这不是获得正确结果的最佳方法。
这是一个包含一些虚构数据的示例:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors
bounds = [0,1.5,3,4.5,5]
colors = ["r", "b", "g", "y"]
cmap = matplotlib.colors.ListedColormap(colors)
norm = matplotlib.colors.BoundaryNorm(bounds, len(colors))
x = np.array([0.0, 0.0, 1.0, 2.0, 2.0, 3.0, 4.0, 4.0, 5.0, 5.0])
y = np.array([0.0, 0.1, 0.8, 0.9, 0.7, 0.1, -0.8, -0.5, -1.0, -0.7])
x_err = np.array([0.05, 0.06, 0.04, 0.045, 0.04, 0.06, 0.05, 0.055, 0.02, …Run Code Online (Sandbox Code Playgroud) import plotly.graph_objects as go
fig = go.Figure()
fig.add_trace(
go.Scatter(
x = [df['x'], df['x1']],
y = df['y'],
mode='markers'
)
)
Run Code Online (Sandbox Code Playgroud)
到目前为止,我可以使用下一个代码独立制作每个图形:
import plotly.express as px
fig = px.strip(df,
x=[df["x"], df['x1']],
y="y",
stripmode='overlay')
Run Code Online (Sandbox Code Playgroud)
是否可以将抖动和多级轴组合在一个图中?
这是重现数据集的代码:
import numpy as np
import pandas as pd
import random
'''Create DataFrame'''
price = np.append(
np.random.normal(20, 5, size=(1, 50)), np.random.normal(40, 2, size=(1, 10))
)
quantity = np.append(
np.random.randint(1, 5, size=(50)), np.random.randint(8, 12, size=(10))
)
firstLayerList = ['15 in', '16 in']
secondLayerList …Run Code Online (Sandbox Code Playgroud)