D3在V4中使用字符串域缩放

时间:2018-01-08 15:02:17

标签: d3.js range scale

我想创建一个包含字符串域的比例:

var scale = d3.scaleXXX().domain(["A", "B", "C", "D", "E"]).range([0, width]);

为了拥有这个方法:

scale(domain: string): number

这样绘制线条这样的转换方法:

svgNode.append('line')
    .attr('x1', (domain) => Math.round(scale(domain)))
    .attr('y1', 0)
    .attr('x2', (domain) => Math.round(scale(domain)))
    .attr('y2', height);

我找不到好的比例类型和方法来设置域名,范围并获得正确的转换方法。

你可以帮帮我吗?

谢谢,

1 个答案:

答案 0 :(得分:2)

在我看来(如果我错了,请纠正我),问题是没有"字符串" 域(无论它是什么),但是分类变量的域被映射到定量范围。

在这种情况下,适当的比例是point scale。根据文档,

  

与连续尺度不同,序数尺度具有离散域和范围[...]点尺度是带尺度的变体,带宽固定为零。点标度通常用于具有序数或分类维度的散点图。

这是一个基于你的代码片段的演示:



import requests
import pandas as pd
import re

url = ("http://api.worldbank.org/v2/countries?format=xml")

r = requests.get(url)

with open(('testcase.xml'), 'w') as f:
        f.write(r.text)

test = r.text

# Parse through string and capture ISO and name
country_iso = re.findall(r"iso2Code>(.*)</wb:iso2Code",test)
country_name = re.findall(r"name>(.*)</wb:name",test)

# store in pandas dataframes, then concatenate them into one
country_iso_df = pd.DataFrame(country_iso, columns=['ISO'])
country_name_df = pd.DataFrame(country_name, columns=['Name'])
output_df = pd.concat([country_iso_df, country_name_df], axis=1)

# print then output to csv
output_df
output_df.to_csv("insert path here")
&#13;
var svg = d3.select("svg");
var data = ["A", "B", "C", "D", "E"];
var color = d3.scaleOrdinal(d3.schemeCategory10)
var scale = d3.scalePoint()
  .domain(data)
  .range([20, 280]);
var lines = svg.selectAll(null)
  .data(data)
  .enter()
  .append("line")
  .attr("y1", 0)
  .attr("y2", 120)
  .attr("x1", d => scale(d))
  .attr("x2", d => scale(d))
  .style("stroke", d => color(d))
  .style("stroke-width", 2);
var axis = d3.axisBottom(scale)(svg.append("g").attr("transform", "translate(0,130)"))
&#13;
&#13;
&#13;