vegas-viz / Vegas

The missing MatPlotLib for Scala + Spark
MIT License
730 stars 99 forks source link

Fold transform doesn't support #173

Open Ying456123 opened 4 years ago

Ying456123 commented 4 years ago

Hi, Sorry to ask as a new user. When I want to compare two columns with layers, I cannot encode color with two columns. Even if I add the encodeColor on the second layer, it doesn't behave as I expected. Below is original code:

val data = Seq(
      ("te1", 300.0, 17.0),
      ("te2", 50.0, 19.0),
      ("te1", 40.2, 21.3),
      ("te2", 15.0, 21.5)
    )

val df = spark.createDataFrame(data).toDF("col", "data1", "data2")
Vegas.layered("Plots two layers").
  withDataFrame(df).
  withLayers(
    Layer().
      mark(Bar).
      encodeX("col", Ordinal, scale=Scale(bandSize=10)).
      encodeY("data1", Quantitative).
      encodeColor(field="data1", dataType=Quantitative),
    Layer().
      mark(Bar).
      encodeX("col", Ordinal, scale=Scale(bandSize=10)).
      encodeY("data2", Quantitative)
  ).
  show

image After I add the encodeColor on second layer, it behaves as below:

Vegas.layered("Plots two layers").
  withDataFrame(df).
  withLayers(
    Layer().
      mark(Bar).
      encodeX("col", Ordinal, scale=Scale(bandSize=10)).
      encodeY("data1", Quantitative).
      encodeColor(field="data1", dataType=Quantitative),
    Layer().
      mark(Bar).
      encodeX("col", Ordinal, scale=Scale(bandSize=10)).
      encodeY("data2", Quantitative).
      encodeColor(field="data2", dataType=Quantitative)
  ).
  show

The result: image Could anyone help? Thanks a lot.

Ying456123 commented 4 years ago

Now I found using fold transformation can give me the expected result, but seems like Vegas doesn't support it now. Below is my Vega-lite's script and result:

{
  "$schema": "https://vega.github.io/schema/vega-lite/v3.json",
  "description": "A bar chart showing the US population distribution of age groups and gender in 2000.",
  "data": {
         "values": [
      {
        "col": "row1",
        "data1": 28,
        "data2":30
      },
      {
        "col": "row2",
        "data1": 47,
        "data2":105
      },
      {
        "col": "row3",
        "data1": 71,
        "data2":177
      }
    ]

     },
       "transform": [{"fold": ["data1", "data2"]}],
       "mark":"bar",
       "encoding":{
         "x":{"field":"col", "type":"nominal"},
          "y": {"field": "value", "type": "quantitative"},
         "color":{"field":"key","type":"nominal"}
       }
}

result: image